1

ユーザーからの入力として最大 30 文字の文字列を取得し、行末が含まれているかどうかを確認したいと考えています。

これは私がこれまでに書いてみたことです:

int main(void) {
int i;
char* command = (char*)calloc(31, sizeof(char));
while (0 < 1) {
    scanf("%s", command);
    for (i = 0; i <= strlen(command); ++i) {
        if (command[i] == '\n')
            printf("here");
    }
    if (strcmp(command, "quit") == 0)
        break;
}

アイデアは、ユーザーが入力として指定したコマンドが「合法」であるかどうかを確認することです。つまり、長さは 31 未満です。このコードを実行すると、入力の長さに関係なく「ここ」が出力されません。

4

3 に答える 3

5

scanf終了する は含まれませんが、次のことを行い'\n'ますfgets

改行文字は fgets の読み取りを停止させますが、有効な文字と見なされるため、str にコピーされる文字列に含まれます。

scanf行を次のように変更するだけです。

fgets(command, 31, stdin);
于 2012-06-05T16:36:43.470 に答える
5

これはscanf()、改行が含まれていないためです。空白と見なされ、空白を使用して変換する値が区切られます。strlen()の戻り値を使用するだけです。

于 2012-06-05T16:33:16.923 に答える
1

fgets を使用してください (詳細については man fgets)。読み取り元のストリームは stdin です。

次のようになります。

fgets(command, 31, stdin);

文字列の最後で (エラーがない場合)、'\0' を探すことができます。文字列の末尾に追加されます (そのため、サイズに 30 ではなく 31 を使用しました)。

また、fgets を使用して任意のストリーム (ファイル、エラーなど) から読み取ることもできます。

それが役立つことを願っています。

于 2012-06-05T16:37:59.447 に答える