特定の文字だけ大文字にするプログラムを作る方法

このQ&Aのポイント
  • 配列とポインタを使って特定の文字だけ大文字にするプログラムを作りたいです。
  • 具体的には、文字列"sports"の中の"s"だけを大文字に変換したいです。
  • 以下のプログラムを作りましたが、正しく動作しません。
回答を見る
  • ベストアンサー

配列とポインタを使って特定の文字だけ大文字にする

配列とポインタを使って特定の文字だけ大文字にするプログラムを作りたいのですがどのように作ればいいのでしょうか? 例えば、sportsのsだけ判別してSportSというふうにしたいです。 一応以下のようなプログラムを作ったのですが、実行してもsportsのままで何も変わりません・・・。 #include<stdio.h> void mojihenkan(char *); main(void) { char moji[8]={"sports"}; char *p; int i; mojihenkan(moji); p=moji; for(i=0;i<8;i++){ printf("%c",*(p+i)); } return 0; } void mojihenkan(char *a) { int i; for(i=0;i<8;i++){ if(*(a+i)=='s'){ a-32; } } }

質問者が選んだベストアンサー

  • ベストアンサー
  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.3

if文では、正しく配列の内容を参照出来ているので、たいへん惜しいですね。 if(*(a+i)=='s'  ⇒ 正しい参照の仕方 a-32;     ⇒ 意味不明 やりたいことは、直前の if 文で判定した配列の内容を書き換えたいのですから、少なくとも左辺は、 *(a+i) にならなければならないです。 更に、新たに書き込む数値は、元の内容から32を引いた(小文字から大文字への変換)なので、右辺は、 *(a+i) - 32 です。 なので、正解は、 *(a+i) = *(a+i) - 32 (これは、C言語の演算子の特徴で省略して、 *(a+i) -= 32 と記述することも出来ます。) まずは、これで試してみてください。 ちなみに、元の通り a-32 とすると、演算結果をどこにも代入していないので何も起こりません。 また、仮に これが a -= 32 であったとすると、配列の内容ではなく、ポインターが 32 戻されることになります。これは実際には確保していない領域になるので、*a を参照すれば不定値ですし、*a に値を書き込むとなんらかのデータの領域をオーバーライトしてしまう危険な操作となってしまいます。

その他の回答 (2)

回答No.2

幾らかは本のサンプルコードを参考にしたか、学校で課題ででたコードを穴埋めしたのかわかりませんが。 ここまで来ておいて、惜しいですね。 a-32; では書き換えた文字の番号はどこにも保存されていませんね。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

>if(*(a+i)=='s'){ >a-32; >} は何をしているのかよく考えましょう。

関連するQ&A

  • ポインタ配列

    "one","two","three","four","five","six","seven","eight","nine","ten" のポインタ配列の文字列を、ASCIIコード順に並べ変えようと思ったのですが、 もうどこが間違っているかさえわからないぐらいになってしまいました。 まだまだはじめたばかりなもので、わからないことだらけなんで、 できるだけわかりやすい説明おねがいします。 関数の引数に問題があるのじゃないかと思ったのですが、 何かいいアドバイスありましたら、お願いします。 #include <stdio.h> /* 関数のプロトタイプ宣言 */ int strmp(char *,char *); void cpy(char *,char *); int main (void) { /* ポインタ配列の定義 */ char *x[10]={"oneee","twooo","three","fourr","fivee","sixxx","seven","eight","ninee","tennn"}; /* ポインタのポインタの定義 */ char **pp=x; char k[100]; char *p=k; int i,t,a,b,c,d; a=0; /* ポインタ配列を自作関数を使って、ASCIIコードの大きいほうからに並び替える */ for(i=0;i<9;i++) { for(t=1;t<10;t++) { a=strmp(*(pp+i),*(pp+t)); if(a<0) { cpy(p,*(pp+i) ); cpy(*(pp+i),*(pp+t) ); cpy(*(pp+t),p); } } } for(i=0;i<10;i++) { printf("%s ,",x[i]); } printf("\n"); return 0; } /* 文字の比較をする関数 */ int strmp(char *x,char *y) { int i; for(i=0;*(x+i)==*(y+i);i++) { if( *(x+i)=='\0') { return 0; } } return *(x+i)-*(y+i); } /* 文字をコピーする関数 */ void cpy(char *a,char *b) { int i; for(i=0;*(b+i)!='\0';i++) { *(a+i)=*(b+i); } *(a+i)='\0'; }

  • ポインタ配列

    ポインタ配列によるひとつのプログラムを組もうと思っています。 で、以下のようなプログラムを作ってみました。 1:#include<stdio.h> 2:#define NUM 5 3:main(void){ 4: char *str[NUM]; 5: int i; 6: for(i=0;i<NUM;i++){ 7: printf("string --->"); 8: scanf("%s",str[i]); 9: } 10: for(i=0;i<NUM;i++){ 11: printf("str[%d] --> %c\n",i,str[i]); 12: } 13:} これなのですが、8行目のscanf文でコンパイルエラーではなく、実行エラーが出ます。どのようにすれば動くようになるのでしょうか? 入力する文字は、9文字以下を想定しています。

  • ポインタ配列で、、。

    #include <stdio.h> #define NUM 3 main (void) { char *c = {"cup"}; char *cc[NUM], a0 = 'L', a1 = 'A', a2 = 'P'; char *ccc[NUM] = {"hat","bat","cat"}; int i; cc[0] = &a0; cc[2] = &a1; cc[2] = &a2; printf("c -----> %s\n", c); for(i = 0; i < NUM; i++) { printf(" cc[%d] -> %c\n", i, *cc[i]); } for(i = 0; i < NUM; i++) { printf("ccc[%d] -> %s\n", i, ccc[i]); } for(i = 0; i < 3; i++) { printf("ccc[0][%d] --> %c\n", i, ccc[0][i]); } } /* わたしの実行結果です c -----> cup cc[0] -> L Press any key to continue */ これはどういうことをしているプログラムなのでしょうか?どうかお願いします。

  • ポインタ配列について

    下のプログラムは、ポインタ変数の配列のプログラムです。 このプログラムを、月の順番を入れ替えて出力するプログラムに変更するにはどのようにすれば良いか分かる方いましたら、是非教えてください。例えば、JANUARYとMARCHを入れ替えて出力するプログラムなどです。 #include<stdio.h> void main() { char *p[] = {"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE", "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; int i,j; *p[0]=*p[2]; *p[0]=*p[2]; for(i = 0;i < 12; ++i){ printf("%2d 月:%s\n",i+1,p[i]); } for(i = 0;i < 12; ++i){ j = -1; do{ ++j; printf("%4x ",p[i]+j); } while (*(p[i]+j) != '\0'); printf("\n"); j = -1; do{ ++j; printf(" %c ",*(p[i]+j)); }while (*(p[i]+j) != '\0'); printf("\n"); } }

  • ポインタ配列のプログラムについて

    ポインタ変数の配列のプログラム #include<stdio.h> void main() { char *p[] = {"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE", "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; int i,j; *p[0]=*p[2]; *p[0]=*p[2]; for(i = 0;i < 12; ++i){ printf("%2d 月:%s\n",i+1,p[i]); } for(i = 0;i < 12; ++i){ j = -1; do{ ++j; printf("%4x ",p[i]+j); } while (*(p[i]+j) != '\0'); printf("\n"); j = -1; do{ ++j; printf(" %c ",*(p[i]+j)); }while (*(p[i]+j) != '\0'); printf("\n"); } } について、このプログラムを最も大きい値(ASCIIの文字コードが最も大きい値)を出力するプログラムに変更したいのですが、ASCIIの文字コードが何なのかよく分かりません。分かる方いましたら教えてください。よろしくお願いします。

  • ポインタと配列 助けてください

    #include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 0}; int i, *ptr; ptr = ######; while (*ptr != 0){ ######; ######; }      for (i = 0; i < 5; i++) printf("a[%d]=%2d &a[%d]=%p\n", i, #####,i, #####); putchar('\n'); ptr = ######; for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n", ####, ####); ####; } printf("\n"); return (0); } 一次元配列a[]の一番目の要素以外を0にするプログラム(ただし、最後の要素は0)を作成したいのですが、#の部分に何をあてはめたらいいかわかりません。 助けてください。

  • 自作関数を用いた文字の反転

    タイトルのまんまですが入力された文字を反転して表示する方法がわかりません。 #include <stdio.h> char reversecopy(char moji[]) { int i; char reversemoji[51]; for(i = 50; i > 0; i--) { reversemoji[i] = moji[i]; } return reversemoji[50]; } void main(void) { char n[51]; printf("何か文字を入力してください: "); scanf("%s" ,n); reversecopy(n); n[50] = '\0'; printf("%s\n" ,n); return; } ここまでは作ったのですが、表示されるのは反転されていない文字です。どこかおかしい点があったら(絶対あるはずですが)ご指摘いただければ助かります。 よろしくお願いしますm(_ _)m

  • ポインタ配列のプログラムについて

    ポインタ変数の配列のプログラム #include<stdio.h> void main() { char *p[] = {"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE", "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; int i,j; *p[0]=*p[2]; *p[0]=*p[2]; for(i = 0;i < 12; ++i){ printf("%2d 月:%s\n",i+1,p[i]); } for(i = 0;i < 12; ++i){ j = -1; do{ ++j; printf("%4x ",p[i]+j); } while (*(p[i]+j) != '\0'); printf("\n"); j = -1; do{ ++j; printf(" %c ",*(p[i]+j)); }while (*(p[i]+j) != '\0'); printf("\n"); } } について、このプログラムを、先頭の文字(1月ならJ、2月ならFなど)のアドレスを変化させて、アルファベット順の次の文字に変更するプログラム(1月ならJ→K、2月ならF→G)に書き換えたプログラムを作成せよ。 この問題が分かる方いましたら、解き方だけでもいいので、是非教えてください。よろしくお願いします。

  • 配列やポインタに文字列を設定することについて

    ◎1------------------------- #include<stdio.h> int main(void) { char ss[80]; scanf("%s",ss); printf("%s\n",ss); return 0; } ---------------------------- ◎2--------------------------- #include<stdio.h> int main(void) { char *ss="abcde"; printf("%s\n",ss); return 0; } ------------------------- ◎3---------------------- #include<stdio.h> int main(void) { char *ss; ss="abcde"; printf("%s\n",ss); return 0; } ------------------------- 以上3つプログラムで疑問をいだいたのですが、 まず◎1で、これは例えば、 cahr ss[80]="abc"; のように配列ssに文字列"abc"そのものを入れているのか、 char *ss="xyz"; のようにまず"xyz"という文字列をメモリ上のどこかに設定し、その先頭番地をssに代入しているのか、どちらの考えでいいのかわかりません。 次に、◎2、3ではどちらも正常に実行できたのですが、特に◎3で「ss="abcde";」と記述していますが、ssにはアドレスを代入するという認識かあるのですが、文字列定数を代入しても問題ないのか?という疑問があります。 教えていただけたら嬉しいです。

  • 文字を逆転させて表示させるプログラミングなのですが・・・。

    #include<stdio.h> int main() { char moji[80]; char hantai[80]; int i; int j; int n; printf("半角文字列を入力:"); scanf("%s",moji); for(n=0;moji[n]!='\0';n++); for(i=n-1,j=0,i>=0;i++;j--){ hantai[j]=moji[i]; } hantai[j]='\0'; printf("反対から:%s\n",hantai); return 0; } 反対からが表示されません。 考えたのですがわかりません。

専門家に質問してみよう