2

scanf 演算子を使用して入力を取得しようとしていますが、その長さも必要char name[number]です。ユーザーから取得する入力のサイズがわからないため、定義できません...

を使用せずにそれを行う方法はありstring.hますか?

これは私がやろうとしたことですが、配列の長さを定義しているので違法です:

char string1[30];
printf("Enter string1:");
scanf("%s",string1);
4

2 に答える 2

1

最大サイズを定義しないとうまくいかないでしょう。

サイズを定義することは重要ではありませんが、後でそれを知って尊重することは重要です.

ユーザーから入力を取得する最も簡単な方法は次のfgets()とおりです。

char string1[50];
fgets(string1, sizeof string1, stdin);

もちろん、その戻り値を確認する必要があります。

(ほぼ) 任意の長さを受け入れたい場合は、ここで示した解決策を試すことができます。

これは、指定された配列のオーバーフローを防ぐために必要です。文字列を操作するには、 wither を使用してその長さを取得できますstrlen()。または、それを使用することが許可されていない場合、または文字列まで歩いている場合は、NUL バイトに到達するまで文字を数えることによって取得できます。

これの背景は、C の文字列が NUL バイトで終了することです。それらはchars のシーケンスであり、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()あなたも同様に実装することになっているのかどうか、私は今はっきりしていません。もしそうなら、私はそれを演習として残します。

于 2013-11-03T20:25:12.757 に答える