scanf 演算子を使用して入力を取得しようとしていますが、その長さも必要char name[number]
です。ユーザーから取得する入力のサイズがわからないため、定義できません...
を使用せずにそれを行う方法はありstring.h
ますか?
これは私がやろうとしたことですが、配列の長さを定義しているので違法です:
char string1[30];
printf("Enter string1:");
scanf("%s",string1);
最大サイズを定義しないとうまくいかないでしょう。
サイズを定義することは重要ではありませんが、後でそれを知って尊重することは重要です.
ユーザーから入力を取得する最も簡単な方法は次のfgets()
とおりです。
char string1[50];
fgets(string1, sizeof string1, stdin);
もちろん、その戻り値を確認する必要があります。
(ほぼ) 任意の長さを受け入れたい場合は、ここで示した解決策を試すことができます。
これは、指定された配列のオーバーフローを防ぐために必要です。文字列を操作するには、 wither を使用してその長さを取得できますstrlen()
。または、それを使用することが許可されていない場合、または文字列まで歩いている場合は、NUL バイトに到達するまで文字を数えることによって取得できます。
これの背景は、C の文字列が NUL バイトで終了することです。それらはchar
s のシーケンスであり、NUL バイト ( '0'
48 ではない 0) がこのシーケンスを終了します。
読み取った文字列が十分に小さいことを確認し、そうでない場合に文句を言うことが唯一のタスクである場合は、それを実行してください:-)
int main(int argc, char ** argv)
{
char string2[50]; // larger than required; in order to be able to check.
char string1[30]; // if all is ok, you have maximum length of 29, plus the NUL terminator. So 30 is ok.
char * ret = fgets(string2, sizeof string2, stdin);
if (!ret) {
fprintf(stderr, "Read error.\n")
return 1; // indicate error
}
if (strlen(string2) >= sizeof string1) { // we can take this size as a reference...
fprintf(stderr, "String 1 too long.\n")
return 1; // indicate error
}
strcpy(string1, string2); // as we have verified that this will match, it is ok.
// Otherwise, we would have to use strncpy.
// Now read the 2nd string by the same way:
ret = fgets(string2, sizeof string2, stdin);
if (!ret) {
fprintf(stderr, "Read error.\n")
return 1; // indicate error
}
if (strlen(string2) >= sizeof string1) { // we can take this size as a reference...
fprintf(stderr, "String 2 too long.\n")
return 1; // indicate error
}
// Now we know that both strings are ok in length an we can use strcmp().
int c = strcmp(string1, string2);
printf("strcmp() result: %d.\n", c);
return 0; // indicate success
}
strcmp()
あなたも同様に実装することになっているのかどうか、私は今はっきりしていません。もしそうなら、私はそれを演習として残します。