• 締切済み

プログラムがうまく動きません…

与えられた文字列の文字を全て大文字に変換する関数letter2capを作成しなさい。 ただし、main関数は以下のものを使用すること。 ただし、関数letter2capではポインタを使用すること。 #include<stdio.h> #define MAXCHAR 1024 void letter2cap( char* p) { while(*p) { if ('a' <= *p && *p <= 'z') *p += ('A' - 'a'); } } int main(void){ char str[MAXCHAR]; gets( str ); letter2cap( str ); printf(゛%s\n゛, str); return 0; } どこがまずいのでしょうか?教えて下さい。

みんなの回答

noname#105911
noname#105911
回答No.3

失礼しました。やっぱり書かないと気付きませんね。 お詫びに、下記のようなコードを提示させてください。 #include<stdio.h> #define MAX_CHAR 1024 char *letter2cap( char* p) { char *str = p; while(*str) { if ('a' <= *str && 'z' >= *str) *str += ('A' - 'a'); str++; } return p; } int main (int argc, const char * argv[]) { char str[MAX_CHAR]; if(NULL == fgets(str, MAX_CHAR, stdin)) return -1; fprintf(stdout, "%s\n",letter2cap(str)); return 0; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

どこが悪いかというと ・p をインクリメントしていない: ただし「*」は不要>#1. 「どこに入れるか」は「どこでインクリメントしなければならないのか」を考えればわかるはずだ. ・「小文字であること」を調べるときに islower を使っていない. ・「大文字に変換する」ときに toupper を使っていない. くらいかなぁ? gets を使ってるのも「悪い」といえば悪いかな.

noname#105911
noname#105911
回答No.1

ポインタをインクリメントしていない。*p++が必要ですね。

archerry09
質問者

補足

どこに付け加えたらよいでしょうか?

関連するQ&A

  • プログラムを上手く動かすには…

    与えられた文字列の文字を全て大文字に変換する関数letter2capを作成しなさい。関数letter2capではポインタを使用すること。 #include<stdio.h> #include<ctype.h> #define MAXCHAR 1024 void letter2cap ( char* ); int main( void ) { char str[MAXCHAR]; gets( str ); letter2cap( str ); printf("%sn",str); return 0; } void letter2cap( char* str) { while( *str ){ *str = toupper( *str ); } } 上手く動かすには何が足りないのでしょうか?

  • どうやっても上手くいきません…

    与えられた文字列の文字を全て大文字に変換する関数letter2capを作成しなさい。ただし、main関数は以下のものを使用すること。 ただし、関数letter2capではポインタを使用すること。 #include<stdio.h> #define MAXCHAR 1024 void letter2cap( char* p) { while(*p); p++; { if ('a' <= *p && *p <= 'z') *p += ('A' - 'a'); } } int main(void){ char str[MAXCHAR]; gets( str ); letter2cap( str ); printf(゛%sn゛, str); return 0; } どこがまずいのでしょうか?教えて下さい 宜しくお願いします 【現時点での実行結果】 ./p242 abc abc abc : : 【実行したい結果】 ./p242 abc ABC

  • 再帰プログラム

    #include<stdio.h> int rstrlen(char*); int main(void) { char str[100]; printf("文字列を入力してください\n"); gets(str); printf("文字数は %d です\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p){ p++; return 1+rstrlen(p); } else return 0; } 文字数を計算するプログラムです。 if(*p)の*pとはNULLを表しているのですか?

  • 文字列ポインタとgets関数の関係について。

    以下のプログラムはコンパイルは出来ますが、 実行するとクラッシュしてしまいます。 gets関数は char *gets( char *str ); と定義されているので文字列の先頭アドレスを返すはずですが 何故このプログラムはエラーが出るのでしょうか・・。 #include <stdio.h> int main ( void ){  char *p, *s;  p = gets(s);  printf("%s", p);  return 0; }

  • 再帰プログラム

    strに格納されている文字数を数えるプログラムです。 #include<stdio.h> int rstrlen(char *); int main(void) { char str[] = {"abcdefghijk"}; printf("文字数:%d\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p) { p++; printf(p); return 1 + rstrlen (p); } else return 0; } return 1 + rstrlen (p);の部分で再帰をし1をプラスすることにより文字数をカウントしmainのprintfで文字数を表示しているのですがカウントしている値はどこに格納していてどのようにmainに返しているのかが分かりませんでした。教えてください。

  • ポインタ スペースを数えるプログラム

    入力した文章のスペースを数えるプログラムを作ってみました. ポインタをまだしっかり理解していないのですが,ポインタを使用 する場合,以下のようなプログラムで正しいですか? (オーバーフローなどについては対処していません.) #include<stdio.h> int main(void) { char str[80],*p; int i,count=0; gets(str); p=str; for(i=0;i<80;i++) { if(p[i]==' ') { count++; } } printf("%d",count); return 0; }

  • 次のプログラムが作れません…

    次のプログラムが作れません… キーボードから文字列と一つの検索文字を入力します。 この時、入力した文字列の中にある、検索文字の個数を表示するプログラムなのですが… 条件が以下のようにあります。 プログラムの関数の定義部分以外は、以下にあげるものを変更せずそのまま使用すること。 #include<stdio.h> int search_letter(char *str, char letter); int main(void){ int cnt; char in[100]; cahr ch; printf("Input a string: "); gets(in); printf("Input a letter: "); scanf("%c", &ch); cnt = search_letter( in, ch ); printf("The number of letter '%c' is %d\n", ch, cnt); return 0; } プログラム中に出てくる関数「search_letter」は、第一引数で与えた文字列へのポインタで示される文字列の中から、第二引数で与えられた文字の個数を計算する関数です。 このプログラムでは大文字、小文字を区別して処理します。 出力結果は以下と同じようにしなければなりません。 ./pz1-2 Input a string: Mousukkari akidesune Input a letter: o The number of letter 'o' is 1 *"./pz1-2"と"Mousukkari akidesune"はキーボードから入力した文字です。 よろしくお願いします。

  • C言語について

    2つの文字列を入力して別の文字列にコピーするプログラムをつくっているのですが、どこが間違っているのでしょうか?教えていただけませんか? /*文字列連結*/ void *my_stract(char*, char*, char*); void main(void) { char bun1[100],bun2[100],bun3[200]; printf("文字列1を入力してください\n"); gets(bun1); printf("文字列2を入力してください\n"); gets(bun2); my_stract(bun1,bun2,bun3); puts(bun3); } char *my_stract(char *str3, char *str2, char *str1) { char *p1, *p2, *p3; p1=str1; p2=str2; p3=str3; while(*p1) { *p3=*p1; p1++; p3++; } while(*p2) { *p3=*p2; p2++; p3++; } *p3='\0'; return str3; }

  • 次のプログラミングが上手くいきません

    このプログラムを実行するとセグメンテーション違反が出てきて上手くできません… #include<stdio.h> #include<stdlib.h> int search_letter( char *str, char letter); int main(void){ int cnt; char in[100]; char ch; printf("Input a string: "); gets(in); printf("Input a letter: "); scanf("%c", &ch); cnt = search_letter( in, ch); printf("The number of letter '%c' is %d\n", ch, cnt ); return 0; } int search_letter( char *str, char letter) { char *p; int n; n=0; p=str; while(p != NULL){ if(letter == *p) n++; p++; } return n; } 実行結果が以下のようにならなければいけないのですが… ./pz1-2 Input a string: Mousukkari akidesune Input a letter: o The number of letter 'o' is 1 *"./pz1-2"と"Mousukkari akidesune"はキーボードから入力した文字です。

  • プログラミング 関数

    教えてください。 入力された文字列のうち、文字aの数を数える関数count_aを作成する。 以下は関数count_aを利用したmainのプログラムの例です。 #include <stdio.h> int count_a(char str[]); int main ( void ) { char str[255]="abcaeag"; printf("%d\n",count_a(str)); return 0; }

専門家に質問してみよう