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:”,然后打印第一句。
答案 0 :(得分:3)
因为您没有从输入缓冲区中读取Enter键,所以当第二个scanf()
请求输入时,它仍然存在。然后它认为你只是按下输入而没有输入任何文字。
答案 1 :(得分:2)
答案 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;
}