toupper関数とstrcmp関数を使った問題

このQ&Aのポイント
  • キーボードから文字列を読み取るプログラムを作成し、「end」と入力されるまで繰り返す。
  • 入力された文字列に大文字と小文字が混ざっていても終了するようにする。
  • 文字列の比較にはstrcmp関数を使用し、小文字を大文字に変換するにはtoupper関数を使用する。
回答を見る
  • ベストアンサー

toupper関数とstrcmp関数を使った問題

前回答えてくださった方々へのお礼 ・前回質問した際、質問に答えてくださった方々、皆様のおかげで問題を解く事ができました。本当にありがとうございました。 ↓ここから質問です。 「end」と入力されるまで、キーボードから文字列を読み取るプログラムを作成してください。ただし、大文字と小文字が混ざった「EnD」などでも終了するようにしてください。小文字を大文字に変換する「toupper( )関数」を利用してください。また、文字列の比較には「strcmp( )関数」を利用してください。 という問題を解いているのですが、自分でした結果 #include <stdio.h> #include <ctype.h> #include <string.h> int main(void) { char str[10]; ←str[10]は適当に値を決めているだけです int i,ret; int result; do { printf("文字列を入力してください:"); scanf("%s", str); i = 0; while (str[i] != ???? ) // 文字列の最後かチェック { ret = toupper(?); // toupper関数に1つずつ渡す i++; } result = strcmp("END", str); //文字列の比較 if (result == 0) { break; //ループを抜ける! } } while (1);            // 条件が1の場合は永久ループ return 0; } ここまではできたのですが、どうしても while (str[i] != ???? ) // 文字列の最後かチェック { ret = toupper(?); // toupper関数に1つずつ渡す i++; } この部分の「?」と書いている部分がわかりませんでした。 わかる方が居られましたらどうか教えてもらえないでしょうか? あと、おかしな部分等がありましたら教えてください。 どうかよろしくお願いします。

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

  • ベストアンサー
  • yokomaya
  • ベストアンサー率40% (147/366)
回答No.1

while (str[i] != ???? ) // 文字列の最後かチェック { ret = toupper(?); // toupper関数に1つずつ渡す i++; } 最後には0が来るのがCの文字列かと。 二番目はstr[i]でしょうけど、retに代入してどう使いたいのでしょう?意図は? 僕ならstr[i]に戻します。

reimu-
質問者

お礼

返答ありがとうございます。 str[i]に戻すとうまくいきました。 本当にありがとうございました^^。

関連するQ&A

  • C言語の変換する関数について教えてください。

    キーボードからローマ字で入力された名前の英文字を変換する関数を定義し、その関数の機能を確認するプログラムを作成する問題について教えてください。 (1)英小文字であればそれを英大文字に変換する関数 (2)英大文字であればそれを英小文字に変換する関数 (3)英小文字であればそれを英大文字に、英大文字であればそれを英小文字に変換する関数 ただし、キーボードから入力された名前を格納する配列と、変換後の名前を格納する配列を別にする。 また、名前は関数main()内で表示する #include <ctype.h> #include <stdio.h> void name_toupper(char str[]) { unsigned i = 0; while (str[i]) { str[i] = toupper(str[i]); i++; } } void name_tolower(char str[]) { unsigned i = 0; while (str[i]) { str[i] = tolower(str[i]); i++; } } int main(void) { char str[100]; printf("文字"); scanf("%s", str); name_toupper(str); printf("大文字: %s\n", str); name_tolower(str); printf("小文字: %s\n", str); return 0; } 自分で作った上のプログラムではKa siと入力すると(1)ではKA、(2)ではkaと表示されsiが消えてしまいます。原因がよくわかりません。 あと(3)ができないし、ただしを満たしているのかもあいまいです。 文字列の入力の形式:char *gets(char *buffer)を用いればどうにかなるのではと思っていますがどうですか? 説明が長くなって申し訳ありませんが教えてください。 よろしくお願いします。

  • 文字列str内の全ての数字を削除する関数

    文字列str内の全ての数字を削除する関数 void del_digit(char str[]) を作成。 (例えば、"ab1C9"を受け取ったら、"ABC"にする) という関数を作りたいのですが、うまくいきません。 過去に似たような『文字列内の数字削除』の質問をされた方が いましたが、ポインタを使っていました。 http://okwave.jp/qa1775576.html ポインタを使わずにするには、どうしたらよいのでしょうか? 途中まで作ってみたのですが、うまく動きません。 #include <stdio.h> #include <ctype.h> void del_digit(char str[]) {     unsigned i = 0, j = 0;     char ctr[] = {'0'};     while (str[i] != '\0') {           ctr[i] = str[i];           i++;     }     i = 0;     while (ctr[i] != '\0') {           if (ctr[i] < '0' || ctr[i] > '9') {              str[j] = toupper(ctr[i]);              j++;           }           i++;     }     str[j] = '\0'; } int main(void) {     char str[100];     printf("文字列を入力してください:");     scanf("%s", str);     del_digit(str);     printf("%s\n", str);     return (0); }

  • 文字列を関数に渡すぷろぐらむなのですがおかしいです。

    <ソース> #include<stdio.h> #include<stdlib.h> void str(char a[]); int main() { char st[10]="abcde"; str(st); str("ABCabc123"); return 0; } void str(char a[]) { int i; printf("%s\n",a); i=0; while(a[i]){ a[i]=toupper(a[i]); putchar(a[i]); i++; } putchar('\n'); } 分からないところがあるので質問します。 toupperは、大文字にするんですよね。 putcharは、基本的にchar型でしたっけ? putsとgetsは、int型でしたっけ? 後、プログラムが暴走してます。 どこがおかしいんでしょう?

  • strcmpでの &

    #include<stdio.h> #include<string.h> int main(void){ char data[10],sort; int i,j; printf("10文字入力してください。\n"); for(i=0;i<=10;i++){ data[i]=fgetc(stdin); /*---挿入ソート---*/ sort=data[i]; j=i-1; while((strcmp(data[j],sort) > 0) && (j>=0)){/*ここでstrcmp(&data[j],&sort)にするとできるんですが。*/ data[j+1]=data[j]; j--; } data[j+1]=sort; } for(i=0;i<=10;i++){ fputc(data[i],stdout); } return(0); } 何故& を入れるだけでエラーが出なくなるのかわかりません。 アドレスを比べて何故大小が出るのか… よろしくおねがいします。

  • C言語 strcmp 半角スペースがあるとだめ?

    C言語 strcmp 半角スペースが文字列に含まれている場合 文字列の比較がうまくいきません。半角スペースがあると比較できないのでしょうか? プログラム //strcmp #include <stdio.h> #include <string.h> int main(void){ char input[256]; char str[] = "HelloWorld!";   //char str[] = "Hello World!";だとうまくいかない。 printf("%s\n>", str); scanf("%s", input); if ( strcmp(input, str) == 0){ printf("同じです。\n"); }else{ printf("違います。\n"); } return 0; }

  • PHPのstrcmp関数について

    PHPのstrcmp関数の動きがよくわかりません。 strcmp (PHP 4, PHP 5) strcmp — バイナリセーフな文字列比較 説明 int strcmp ( string $str1 , string $str2 ) この比較は大文字小文字を区別することに注意してください。 パラメータ str1 最初の文字列。 str2 次の文字列。 返り値 str1 が str2 よりも小さければ < 0 を、str1が str2よりも大きければ > 0 を、 等しければ 0 を返します。 ・・・・・・・・・とマニュアルには上記のようにあります。 聞きたい事!▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ 1 このstr1がstr2より大きいとはどういうことでしょうか? 2 実際に動きを確認するためにstrcmp関数を他のPHPのビルトイン関数で実現できないのでしょうか? 私の想像では、この関数にあたえる二つの引数を10進数に変換して、値の大きさを比較するという方法なのですが・・。 たとえば <?php $str01 = "a"; $str02 = "b"; print strcmp($str01,$str02); print "<br />"; //上記の値は-1がでるためこの場合 $aのほうが$bより小さいことになる。 //$aの値の文字aが小さいとは?どういうことか //私の、ぱっと思いついた方法は、以下のような意味? $str01 = bin2hex($str01); print $str01 ; //16進数でaという値を表すと61がでる print "<br />"; $str01 = hexdec($str01); print $str01; //10進数でaという値を表すと97がでる print "<br />"; //上記を同じく$bに行うと $str02 = bin2hex($str02); print $str02 ; //16進数でaという値を表すと62がでる print "<br />"; $str02 = hexdec($str02); print $str02; //10進数でaという値を表すと98がでる print "<br />"; print "<hr />"; /* 結果、$aは$bより 【小さい】という事なのでstrcmpは-1を返したと・・・。 こういう事をかんがえてみました。 そしてこれは、普通に考えれば a => bという順序なので アルファベット順になります。 しかしこのやり方だと */ $str03 = "aaaaaaa"; $str04 = "bb"; //と上記のような文字列があった場合同じく同じ手順で値をだすと $str03 = bin2hex($str03); print $str03 ; //16進数でaという値を表すと61616161616161がでる print "<br />"; $str03 = hexdec($str03); print $str03; //10進数でaという値を表すと27410143614427489がでる print "<br />"; //上記を同じく$bに行うと $str04 = bin2hex($str04); print $str04 ; //16進数でaという値を表すと6262がでる print "<br />"; $str04 = hexdec($str04); print $str04; //10進数でaという値を表すと25186がでる print "<br />"; /*ただ上記の方法だと、$str03と$str04を比較すると$str04の【bb】という値の方が 小さくなり順序的には bb => aaaaaaとなりアルファベット順にするとこができない。 三つ目の質問 3 アルファベット順にソートしたいとき標準のsort関数を使わずに他のPHPの標準関数の組み合わせでアルファベット順に並び替える 関数はつくれないのか? どなたか、ご意見お聞かせください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • strcmp

    超C言語初心者です。strcmpを使わずに文字列を比較する文を書いているのですが、途中でわからなくなりました。 宜しければご指摘お願いします。 #include<stdio.h> int main(){ char cp1[100],char2[100]; int i=0; int j=0 printf("1つ目の文字列:\n"); scanf("%s\n",cp1); printf("2つ目の文字列:\n"); scanf("%s\n",cp2); while(cp1[i]=='\0' || cp2[j]=='\0'||cp1[i]==cp2[j]=='\0'){ cp1[i++]; cp2[j++]; } if(cp[i]==cp2[j]=='\0'){ printf("同じ文字数\n); }else if (cp1[i]=='\0'&&cp2[j]!='\0'){ printf("2つ目の方が大きい\n); }else if (cp2[j]=='\0'&&cp1[i]!='\0'){ printf("1つ目の方が大きい\n); } exit(0); } と今書いています。間違いだらけでしょうが、お願いします!!

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

    与えられた文字列の文字を全て大文字に変換する関数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 ); } } 上手く動かすには何が足りないのでしょうか?

  • C言語ののポインタについて

    「明解C言語 入門編」p262の演習11-4についての質問です。 このサイトも参考にしてみて、 入力された文字の大文字小文字を反転するプログラムをvimで書いてみたのですが #include <stdio.h> #include <ctype.h> void str_toupper(char *str) { while (*str = toupper(*str)) { *str++; } } void str_tolower(char *str) { while(*str = tolower(*str)) { *str++; } } int main(void) { char str[100]; printf("文字列を入力してください:"); scanf("%s", str); str_toupper(str); printf("大文字:%s\n", str); str_tolower(str); printf("小文字:%s\n", str); return(0); } clangを用いてコンパイルすると4warnings generatedと出ます。 ------------------------------------------------------------ ex11-4.c:6:13: note: use '==' to turn this assignment into an equality comparison while(*str = toupper(*str)){ ^ ------------------------------------------------------------- こんなのや ---------------------------------------- ex11-4.c:7:3: warning: expression result unused [-Wunused-value] *str++; ^~~~~~ ---------------------------------------------------- といった警告が表示されます。 どこをどう訂正すれば良いのでしょうか。 よろしくお願いします。

  • strcmp関数などでの複数の文字列の比較

    以下の例はランダムなiの値で文字列にアクセスして その文字列がどの文字列であるかを判定しているプログラムです。 char *string[] = {   "aaa",   "bbb",   "ccc", } ; int i = rand() % 3; if ( strcmp( string[ i ], "aaa" ) == 0 ) {   printf("aaaです"); } if ( strcmp( string[ i ], "bbb" ) == 0 ) {   printf("bbbです"); } if ( strcmp( string[ i ], "ccc" ) == 0 ) {   printf("cccです"); } するとこのようにif文の羅列になってしまいます。 (strstr関数を使う場合などでも同じような感じです。) 複数の文字列を判定する場合などにもっと良い手法は無いでしょうか?

専門家に質問してみよう