为什么我的%[^ \ n]不能正常工作?

时间:2017-09-19 14:01:09

标签: c

int main() {
    char a[100];

    printf("\nEnter 1st Sentence : ");
    scanf("%[^\n]", a);
    printf("\nSentence 1 : %s", a);

    printf("\nEnter 2nd Sentence : ");
    scanf("%[^\n]", a);
    printf("\nSentence 2 : %s", a);

    return 0;
}

我的输出:

Enter 1st Sentence : Testing 1st Sentence
Sentence 1 : Testing 1st Sentence
Enter 2nd Sentence : 
Sentence 2 : Testing 1st Sentence

我基本上都在检查%[^ \ n]。当我输入第一句并按“Enter”键时,打印“输入第二句:”,然后打印“句子2:”,然后打印第一句。

3 个答案:

答案 0 :(得分:3)

因为您没有从输入缓冲区中读取Enter键,所以当第二个scanf()请求输入时,它仍然存在。然后它认为你只是按下输入而没有输入任何文字。

答案 1 :(得分:2)

而不是scanf("%[^\n]", a),请使用:

fgets(a, sizeof(a), stdin);

自己just strip the trailing newline

答案 2 :(得分:0)

scanf("%[^\n]", a)存在多个问题:

  • 如果读取长度超过99个字节的行,则可能存在缓冲区溢出。您可以使用scanf("%99[^\n]", a)阻止此操作。

  • 您将换行符保留在输入流中,并且它仍然存在于下一次调用中,导致转换失败,因为格式必须至少匹配与换行符不同的一个字节。您可以通过使用scanf(" %[^\n]", a)忽略前导空格来阻止此操作。请注意格式字符串中的初始空格。

  • 您不检查转换是否成功。 scanf()返回成功转化的次数。在您的情况下,它应该返回1

以下是修改后的程序:

#include <stdio.h>

int main(void) {
    char a[100];

    printf("\nEnter 1st Sentence: ");
    if (scanf(" %99[^\n]", a) != 1)
        return 1;
    printf("\nSentence 1 : %s", a);

    printf("\nEnter 2nd Sentence : ");
    if (scanf(" %99[^\n]", a) != 1)
        return 1;
    printf("\nSentence 2 : %s", a);

    return 0;
}