fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
exit(-1);
}
quitと入力しても、プログラムは終了しません。なぜそうなのかしら。
ちなみにinput
として宣言されていchar *input;
ます。
関数fgets
は、読み取られた文字列の最後に改行を追加する場合があります。次のことを確認する必要があります。
size_t ln = strlen(input) - 1;
if (input[ln] == '\n')
input[ln] = '\0';
あるいは
strtok(input, "\n");
入力の末尾の改行。manfgetsを参照してください。「quit」+改行をテストします。次に例を示します。
fgets(input,sizeof(input),stdin);
if(strcmp(input, "quit\n") == 0){
exit(-1);
}
私は最後の文を完全に逃しました、re char *input
。アーキテクチャに応じて、input
4バイトまたは8バイトの長さになります。したがって、コードは効果的に
fgets(input, 8, stdin);
これはメモリの実際のサイズを反映していない、とinput
指摘しています。これは、入力が8バイトより短い限り「機能」する可能性がありますが、入力が大きい場合は入力が切り捨てられます。さらに、次に呼び出したときに残りの入力を取得しますfgets
。
実際のサイズを指定するか、@ JonathanLefflerのアドバイスを受けて、代わりにchar配列を宣言する必要があります。
char input[64];
fgets(input, sizeof(input), stdin);
また
char *input = malloc(N);
fgets(input, N, stdin);
これを次のようにコーディングすることをお勧めします。
if(strstr(input, "quit") != NULL){
理由:これにより、余分な文字(テキストの前後のスペースなど)を追加する人々の問題が解決されます。
このソリューションは、標準ライブラリ(stdio.h)のみを必要とし、同じ結果をもたらします。
for (i = 0; input[i] != '\0'; i++); /* getting the string size */
input[i-1] = '\0'; /* removing the newline */
私がしたことは、改行を'\0'nullに置き換えることです。
while(fgets(message,80,stdin))
{
l=strlen(message)-1;
if(message[l]='\n') message[l]='\0';
else message[i+1]='\0';
}