• 締切済み

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); } と今書いています。間違いだらけでしょうが、お願いします!!

みんなの回答

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

> 「一般的な」と書いたのは、私がC言語の数多くある処理系に精通していないため、本当にそうなのか断定することが出来なかったからです。 標準規格では可能です。 非標準処理系の中にはできないものもあるかもしれませんが、それらは「一般的な」処理系ではありません。

  • LOHA
  • ベストアンサー率52% (203/388)
回答No.7

連投ですみませんが、語弊を招きそうなので、更に補足させてください。 「一般的な」と書いたのは、私がC言語の数多くある処理系に精通していないため、本当にそうなのか断定することが出来なかったからです。 それ以外の他意はありません。 ご存じの方がいれば、補足をお願いします。 #chianti1986さん、話の本筋と逸れてすみません。

  • LOHA
  • ベストアンサー率52% (203/388)
回答No.6

No.3です。 断定で書いたのは明らかな誤りでした。 一般的なCの仕様上では書けると訂正させてください。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.5

>まず `cp1[i]==cp2[j]=='\0'` なんて書き方は出来ません。 LOHAさん嘘を書かないでください。 書けます、文法上合法です。意味はhitomuraさんの書いたとおり「(cp1[i]==cp2[j])=='\0'」の意味で、「(cp1[i]!=cp2[j])==0」、「!(cp1[i]!=cp2[j])」、「(cp1[i]!=cp2[j])」と同じになり今回のプログラムでは意味が違いますが、書けることは書けます。

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

> strcmpを使わずに strncmpとかstrcollとかwcscmpとかを使えばよいだけでは? スクラッチで書くには実力が不足している気がします。

  • LOHA
  • ベストアンサー率52% (203/388)
回答No.3

まず `cp1[i]==cp2[j]=='\0'` なんて書き方は出来ません。 ちゃんと `cp1[i] == '\0' && cp2[j] == '\0'` と書きましょう。 >while(cp1[i]=='\0' || cp2[j]=='\0'||cp1[i]==cp2[j]=='\0'){ 比較が逆です。 比較した結果がtrueの時にループが回ることを思い出してみてください。 >cp1[i++]; >cp2[j++]; 配列の要素番号の部分でインクリメントするのはおかしいです。 普通に i++; 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); >} だと、同じ長さの時が抑えられていません。 それと、アルゴリズムも微妙ですね。 while (cp1[i] != '\0' || cp2[i] != '\0')  ++i; として、iの位置の文字(char)を(値として)比較してみたらどうでしょう? 後はじっくり考えてみてください。

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

ちょっと突っ込みどころ満載な気はしますけど、とりあえず strcmp()は文字列の長さを比較する関数ではないですよ。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

1. while文はカッコ内の条件が成立「している間」処理を繰り返します。成立「するようになるまで」ではありません。 なお、C言語では「条件が成立『するようになるまで』繰り返す構文」はありません。そのような処理が必要になった場合はその条件の否定が成立している間処理を繰り返すように書きます。 2. 演算子の結合順の関係上、  cp1[i]==cp2[j]=='\0' という式は  (cp1[i]==cp2[j])=='\0' と解釈されます。それは多分あなたの望む結果とならないでしょう。 というか、その前のほうで2文字列が終端に来たことをチェックしているのだから、ここでは別のことをチェックすべきです。 3.  cp1[i++];  cp2[j++]; という文は確かにあなたの想定どおり動きます。しかし、  i++;  j++; で十分です。 4. 途中で文字列が違っていた場合(たとえば"abc"と"abz")の処理が抜けています。 5. 変数jは不要にできます。

関連するQ&A

  • 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; }

  • プログラムのことで

    次のプログラムの変数の説明と処理の流れを素人でも理解できるように説明してもらえないでしょうか。 #include <stdio.h> #define MAX 128 int str_comp(char nx[], char ny[]){ int i, j, k=0; for(i=0; i<=MAX; i++){ if( nx[i]=='\0' ){ return 0; } else if( nx[i]==ny[0] ){ for( j=0; nx[i]==ny[j]; j++ ){ i++; } if( ny[j]=='\0' ){ return 1; } } } } int main(void) { char namex[MAX}; char namey[MAX}; int n; int i; printf("文字列x(64文字まで)? "); scanf("%s",namex); printf("文字列y(64文字まで)? "); scanf("%s",namey); n=str_comp(namex,namey); if(n==1){ printf("'%s'に'%s'は含まれます\n",namex,namey); } else if(n==0){ printf("'%s'に'%s'は含まれません\n",namex,namey); } return 0; } 実効結果 文字列x(64文字まで)? Katatsumuri  文字列y(64文字まで)? ta 'Katatsumuri'に'ta'は含まれます. エラーは出ないはずです。 よろしくお願いします。

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

    #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; } 反対からが表示されません。 考えたのですがわかりません。

  • 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関数を使う場合などでも同じような感じです。) 複数の文字列を判定する場合などにもっと良い手法は無いでしょうか?

  • 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); } 何故& を入れるだけでエラーが出なくなるのかわかりません。 アドレスを比べて何故大小が出るのか… よろしくおねがいします。

  • 検索させるプログラムです。

    文字列を入力させて、その後に検索キー入力をし、先ほど入力した文字列のなかから 一致するものを検索するプログラムです。 #include <stdio.h> int searchidx(char a[],char key) { int i=0,j=0; a[3]=key; for(i=0;i<3;i++){ if (a[i] == key){ j++; break; } } if(j==0){ return(-1); }else{ return(i); } } int main(void) { int a,i; char ky=0; char x[3]; printf("3個の文字を入力してください。\n"); for (i = 0; i < 3; i++) { printf("x[%d]:", i); scanf("%s", &x[i]); } printf("検索キー:"); scanf("%s", &ky); a=searchidx(x,ky); if (a == -1){ puts("一致しません。"); }else{ printf("%d\n",a); printf("%s\n",x[a]); } } メイン関数で文字列を入力させ、その配列とキー値をサーチ関数に渡して 一致した時の配列の添え字をaに返してメイン関数で文字列の配列のその添え字x[a]で表示されるのではないか?と思ってそうしてるつもりなのですが 実行してみると最後の一致した結果を表示させるところでエラーがでます。 表示させるところの前のprintfで一致するものの要素数が帰ってくるかどうかのチェックを入れてますが ちゃんと添え字番号は正しく返ってくるのになぜ最後の printf("%s\n",x[a]); ではダメなのでしょうか? それとscanfって%sのときは&いらなかったと思うのですが この場合&を入れないとエラーになってしまいます。

  • 一番大きい奇数を表示する

    scanf関数を使用して、文字列を10回入力し一番大きい文字列を表示するプログラムを作ったのですが、 一番大きい「奇数」を表示するように条件を加えた場合どうすればよいのでしょうか? 偶数=割り切れる 奇数=割り切れない ということまでは分かるのですがその先が分かりません。 一応一番大きい文字列を表示するプログラムを貼っておきます。 #include <stdio.h> int main(void) { char str[1024]; char buf[10]; int i; printf("文字列を10回入力して下さい:\n"); memset(str, 0, sizeof(str)); for (i = 0; i < 10; i++) { memset(buf, 0, sizeof(buf)); printf("input>\n"); scanf("%s", buf); } if (strcmp(buf, str) > 0) { strcpy(str, buf); } printf("output>\n%s\n" , str); getchar(); }

  • 関数の作り方

    文字列s1に文字列s2が含まれるか判定する関数search を作りたいのですが、コンパイルできません。 どこに問題がありますか?? #include<stdio.h> #include<string.h> int seach(char *s1,char *s2) { char *p; p = strstr(s1,s2); if(p == NULL){ return 0; }else{ return 1; } } main(void){ char s1[255]; char s2[255]; int res; printf("文字列s1を入力:"); scanf("%s",s1); printf("文字列s2を入力:"); scanf("%s",s2); res = search(s1,s2); if(res == 1){ printf("文字列s1に文字列s2が含まれます\n"); } if(res == 0){ printf("文字列s1に文字列f2は含まれません\n"); } return 0; }

  • CTR-Dでプログラムを終了

    学校の課題で、 --- 探索キーとして名前を入力し、入力と一致した場合、その名前と年齢を印字することを繰り返す。 CTR-Dが入力されたとき、プログラムを終了する。 また、文字比較の為に関数strcmpを使用する。 --- という課題が出されたのですが、while(scanf("%s", name) != EOF)を入れるとうまくいきません。 自分で途中までやったものは↓のものです。 どこが違うのか教えてください(>_<) #include<stdio.h> #include<string.h> #define N 10 struct card{ char *name; int age; }; struct card meibo[N] = { "Takahashi", 14, "Kobayashi", 15, "Hosokawa", 17, "Sugimoto", 18, "Sawai", 19, "Itou", 20, "Kawai", 22, "Ishikura", 24, "Oda", 25, "Nakamura", 28 }; int main(void){ char *name; int i; printf("name? : "); scanf("%s", name); while (scanf("%s", name) != EOF){ for (i=0; i<N; i++){ if (strcmp(name, meibo[i].name) == 0) break; } } if (i<N){ printf("%s is %d.\n", meibo[i].name, meibo[i].age);} else{ printf("Not found.\n");} return 0; }

  • 文字列の探索

    ファイル名を指定して文字列の探索を行うというプログラムをC言語で作成したのですが、 コンパイルのときに警告で「問題のあるポインタの変換(関数 main )」と出て、うまい具合に動きません。改良点を教えてください。 #include<stdio.h> #include<string.h> #include<stdlib.h> unsigned char *s1; unsigned char *s2; unsigned char *cp; FILE *fp; char fname[64]; void TestStrStr(void); main(){ s1 = calloc(256, sizeof(unsigned char)); s2 = calloc(256, sizeof(unsigned char)); printf("Input Filename..."); scanf("%s",fname); while(1){ fp = fopen(fname, "r"); if(fp == NULL){ printf("ファイルを開くことができません...\n"); printf("Input Filename..."); scanf("%s",fname); }else break; } s1=fp; // printf("文字列1を入力してください:"); // scanf("%s",s1); printf("文字列2を入力してください:"); scanf("%s",s2); TestStrStr(); return 0; } void TestStrStr(void){ cp = strstr(s1, s2); if(cp == NULL) printf("'%s'に'%s'のいずれの文字も含まれない.\n", s1, s2); else printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1); free(s1); free(s2); }

専門家に質問してみよう