• 締切済み

C言語で 小文字を大文字に変えるプログラム

C言語で小文字を大文字に変えるプログラムを造ったのですが、エラーが出てしまいます。 どこが間違っているのか教えてください。 #include<stdio.h> main() { char a[100]; scanf(%c,&a[i]); int i=0; while(i<100){ i++; if(a[i]>60){ printf("%x-20",a[i]); }else{ printf("%x",a[i]) } } }

みんなの回答

回答No.5

小文字から大文字にするときは、toupperを使いましょう。

noname#130082
noname#130082
回答No.4

他の方の回答にもあったようですが、 int i=0; の後、 while(i<100){ としてから、すぐ、 i++; してますね? すると、iは最後は100になるわけです。 その時点で、a[i]が添え字の範囲オーバーです。 i++ はループの最後でないと・・・。 とはいえ、このような場合は、whileでなく、for文を使うべきではないかと・・・。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

プログラム的に正しいという意味であれば、 #include <stdio.h> #include <ctype.h> int main(void) {  char a[100];  scanf("%99[^\n]", a);  for (int i = 0; a[i] != '\0'; i++) {   printf("%c", toupper((unsigned char)a[i]));  } } こんな感じではないでしょうか? 処理系不明の状況ですので... ・mainの仮引数並びはvoidにすべきです。 ・mainの返却型はintでなければなりません。 ・100文字未満の(空白を含む)文字列をscanfで入力するための書式は%99[^\n]であり、二重引用符が必須です。 ・ループは文字列中のナル文字を見つけた時点で抜けるようにしなければなりません。 ・文字コード不明なので、小文字かどうかを値で判定することはできません。 ・文字コード不明なので、小文字→大文字変換は計算で行うことができません(toupperを使用すべき)。 ・printf("%x",a[i])にセミコロンが抜けています。また、書式は%cとすべきです。 なお、ブロックの途中での宣言は問題ありません。main関数にreturn文がない場合は0が返されることが規定されています。 ただし、古い規格ではそうはなっていないので要注意です。

noname#77845
noname#77845
回答No.2

#1です。 質問のプログラムは、 ・main()  main関数はこのままの記載では int main(void) と同じ事。  何も返さないなら void main(void) にする。 ・scanf(%c,&a[i]);  書式を指定するときは、""で括る。 ・int i=0;  変数の宣言は、最初に実行する。 ・printf("%x",a[i])  セミコロンがない。 とケアレスミスが多すぎます。もっと注意してコーディングしましょう。 で、プログラム的に正しそうなものは、 #include<stdio.h> void main(){ char a[100]; int i=0; scanf("%s",&a[i]); while(i<100){ if(a[i]==0)break; if(a[i]>96){ printf("%c",a[i]-32); }else{ printf("%c",a[i]); } i++; } } の様になります。 ・if(a[i]>60){  16進数の60を引きたいなら16進数で記述する。(今回は10進数) ・printf("%x-20",a[i]);  書式を指定するところで -20 としても計算されない。 (10進数に書き直してあります。) ・入力文字列が終わったら終了する。

noname#77845
noname#77845
回答No.1

#include<stdio.h> void main(){ char a[100]; int i=0; scanf("%c",&a[i]); while(i<100){ i++; if(a[i]>60){ printf("%x-20",a[i]); }else{ printf("%x",a[i]); } } } これで、コンパイルエラーはなくなります。 プログラムが正しいかどうかは別問題。

関連するQ&A

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • C言語 文字列の比較 compare

    プログラミング初心者です。 60文字以内の文字列を入力して、 大小関係を比較・表示するプログラムなのですが・・ 「AはBより大きい」という結果しか出ません。 どこが間違っているのか、ご指摘お願いしますっ。 #include<stdio.h> int main(void) { char moji1[61]; char moji2[61]; printf("文字列Aを入力===>"); scanf("%60s" ,&moji1); printf("文字列Bを入力===>"); scanf("%60s" ,&moji2); if(moji1-moji2>0){ printf("===AはBより大きい===\n"); } else if(moji1-moji2<0){ printf("===AはBより小さい===\n"); } else if(moji1-moji2==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y){ if(*x=='\0') return 0; x++; y++; } return (*x-*y); }

  • c言語のポインタへの文字列入力についてです。

    当方c言語初学者なのですがscanfを使ってポインタに文字列を入力したいのですがバグが発生して進みません・・・どういうことなのでしょうか? #include <stdio.h> int main(void) { char *a; scanf("%s", a); printf("%s", a); return (0); } *aをa[128]; のように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)

  • C言語について プログラムが動きません

    ゲームのプログラムを作りたいものです。 今、試作の途中の段階で以下のようなプログラムを作ってみたのですが、 コアダンプが表示されてうまく起動しません。 どの点を変更すればいいのか、教えてください。 使っている言語はC言語です。 よろしくお願いいたします。 #include <stdio.h> #include <string.h> struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int attack; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; char names[5][10] = {"v", "w", "x", "y", "z"}; main(){ int s = 0; int a[3]; int i; int m; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60}, }; printf("好きなモンスターを3つ選んでください\n\n"); while (s < 1){ for (i = 0; i++; i<3){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m++; m < 4) printf("%d, %s\n", m+1, monster[m].name); printf("5, %s\n\n", monster[4].name); scanf("%d", a[i]); printf("%d体目 : %s\n\n", i+1, monster[a[i]-1].name); } printf("これでよろしいですか?\n"); for(i = 0; i++; i<2) printf("%d体目 : %s ", i+1, monster[a[i]-1].name); printf("3体目 : %s\n\n", monster[a[2]-1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &i); if(i=1) return s = 1; else return s = 0; } }

  • C言語の質問です。

    C言語の質問です。 C言語で、PCの時間を、キーボードで入力した好きな秒数ごとに表示するプログラムを作りたいのですが、どうしても1秒ごとになってしまいます。ここまで作ったのですが、あとどのようにすればよろしいでしょうか? #include <stdio.h> #include <time.h> #include <string.h> int a2i(char x); main() { time_t jikoku; char t[30]; int h,m,s,so=0; int x,a; printf("秒数xを入力"); scanf("%d",&x); while(1){ for(a=0;a<x;a++){ time(&jikoku); strcpy(t,ctime(&jikoku)); h=a2i(t[11])*10+a2i(t[12]); m=a2i(t[14])*10+a2i(t[15]); s=a2i(t[17])*10+a2i(t[18]); if(s!=so+a){ printf("%d:%d:%d\n",h,m,s); so=s; } } } } int a2i(char x) { return(x-'0'); }

  • C言語の無効な値が入力されたときの繰り返しについて

    C言語で最初に入力した整数の5倍になるまで何度も入力を促すプログラムでわからないところがあるのですが #include  "stdio.h" int main() { int a ; do { printf("input a:"); scanf("%d",&a); } while( )     ← printf( ) ←この二つの()内の文字をどうすればよいのか分かりません return 0; } 教えていただけないでしょうか

  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

  • c言語において、

    "キーボードから自分の名前と住所を半角英文字で大文字と小文字をランダムに続けて入力し、「自分の名前と住所」と「小文字が何文字あるかと、大文字が何文字あるか」をディスプレィに表示するプログラムを作成しなさい。” とした場合、どのように表示させればよいのでしょうか?ちなみに、 #include<stdio.h> void main(void) { char a[100]; int i=0; printf("自分の名前と住所を半角英小文字で大文字と小文字をランダムに続けて入力して下さい\n"); scanf("%s",a); while(a[i]!=0){ if(a[i]<65,90<a[i]<97,122<a[i]) printf("a[%d]=%c, ",i,a[i]); else if(64<a[i]<91) printf("a[%d]=%c,%c ",i,a[i],a[i]+32); else printf("a[%d]=%c,%c ",i,a[i],a[i]-32); if((i+1)%5==0) printf("\n"); ++i; } } では、うまくいきません。 具体例を書いていただけるとありがたいです。

  • 入力された文字列の中の数字を全てを削除するプログラム(C言語)

    入力された文字列の中の数字を全てを削除するプログラム(C言語) 柴田望洋さんの「明解C言語入門編」という本の演習11-5に当たるこのプログラムの作り方がどうしてもわかりません。 なんとか書いてみましたが、実行してもうまくいきません。 どこが悪いのか自分でもわかりません。 誰か教えてくださいお願いします。 以下が僕が書いたコードです。 #include<stdio.h> void del_digit(char *str){ unsigned i=0; char *a; while(*(str+i)){ if(*(str+i)<0 || *(str+i)>9) *a++=*(str+i); i++; } printf("%s",a); } int main(){ char *str; scanf(" %s",str); del_digit(str); return 0; }

  • このプログラムの復元処理教えでください。助けてくだ

    #include <stdio.h> int main(void) { char a[51]; char b[101]; char c[51]; int i,k; int cnt; printf("文字例-->"); scanf("%s",a); i = 0; k = 0; while(a[i] !='\0') { cnt = 0; b[k] = a[i]; while(b[k] = a[i]) { cnt++; i++; } k++; b[k] = cnt + 48; k++; } b[k]='\0'; printf("b=%s\n",b); printf("c=%s\n",c); //-------------------------------------------------- getchar(); return 0; }

専門家に質問してみよう