5

理由は不明ですが、Cプログラムを実行した結果はまったく予想外です。なんらかの初心者のミスだと思いますが、どこにあるのかよくわかりません。

#include <stdio.h>
#include <string.h>
int main()
{
char string1[50];
char string2[50];
int compare;

puts("Enter two strings: ");
fgets(string1, strlen(string1)+1, stdin);
fgets(string2, strlen(string2)+1, stdin);

compare=strcmp(string1, string2); /* usage of extra variable makes the code more readable but wastes more memory */

printf("%d: ",compare);

if (compare<0) puts("First string is lesser");
else if (compare>0) puts ("First string is bigger");
     else puts("Strings are equal");


return 0;
  }

そしてテストについて:

Enter two strings: 
heheisntthisalongstring
heheisntthisalongstring
1: First string is bigger


------------------
(program exited with code: 0)
Press return to continue

それらの文字列は等しくないはずですか?

4

4 に答える 4

13
fgets(string1, strlen(string1)+1, stdin);
fgets(string2, strlen(string2)+1, stdin);

これらは間違っています。string1string2は初期化されず、strlenヒットするまでバイト数をカウントするだけ\0です。この場合、strlen任意の(ランダムな非負の)数値を返すことができます。

sizeofここではなく、を使用しstrlenます。

于 2012-08-24T11:22:59.347 に答える
3

ここ

 char string1[50]; 
 char string2[50]; 

それらを初期化しないのでstrlen、配列の開始後に最初に見つかったnull文字を探しているため、への最初の呼び出しは信頼できません。これはどこにでもある可能性があり、呼び出しの結果はサイズを正確に反映している場合とそうでない場合があります。結果にまったく依存することはできません。

于 2012-08-24T11:24:10.543 に答える
0

string1は0にmemsetされてstrlen(string1)いないため、valueは期待値(50)を提供しません。strlenに達するまで文字をカウントします\0。したがって、クラッシュにもつながる可能性があります(未定義の動作)。

両方のより良いmemsetstring1string2以下のように。

char string1[50] = {0}; 
char string2[50] = {0};

sizeofまた、演算子を使用して値を取得します50

fgets(string1, sizeof(string1), stdin); 
fgets(string2, sizeof(string2), stdin);

または、直接scanfに移動します

scanf("%s", string1);
scanf("%s", string2);
于 2012-08-24T11:37:23.207 に答える
0

これを見てください-strlen

使用しているコードは適切ではありませんが、共通の文字列変数strncmpの3番目のパラメーターを指定することで、期待どおりの答えを得ることができます。strlenただ楽しみのために。常に変数を初期化してください。そうしないと、アプリケーションがクラッシュする可能性があります。あなたはここで例を見ることができます-strncmp

于 2012-08-24T11:45:08.607 に答える