输入中的scanf问题

时间:2011-08-13 20:39:23

标签: c scanf

嗨我在连续读取两个带空格的字符串时使用scanf时遇到问题

char name[50] = {0};
char address[100] = {0};
char name1[50] = {0};
char address1[100] = {0};
int size = 0;
//input = fopen("/dev/tty","r+");
//output = fopen("/dev/tty","w");
printf("\nenter the name:");
scanf("%[^\n]s",name);
//fgets(name,sizeof(name),input); // this works fine
printf("\nenter the address:");
scanf("%[^\n]s",address);
//fgets(address,sizeof(address),input); // this works fine

地址的输入根本没有被采用..也许它将返回键作为输入?

2 个答案:

答案 0 :(得分:2)

新行('\n')字符在第一次scanf调用后仍在输入流中,因此第二个scanf调用会立即看到它,并立即停止读取。

我注意到您在评论中提到了fgets - 为什么不使用它?它做你想要做的很好。

答案 1 :(得分:2)

你有几个问题。

正如@sander指出的那样,你没有做任何事情来清除输入缓冲区中的换行符。

您还使用了%[^\n]s - 但扫描集转换不需要s(也不是其中的一部分)。由于它不是转换的一部分,因此scanf尝试在输入中匹配该字符 - 但由于您刚刚读到新行(而不是读取换行本身),因此或多或少要求's'= ='\ n' - 显然不可能,因此扫描失败。

为了完成这项工作,您可以使用以下内容:

scanf("%49[^\n]%*c", name);
scanf("%99[^\n]%*c", address);

至于为什么要使用它而不是fgets,一个明显的原因是,当事情正常工作时,包含尾随(并且很少需要)的换行符。 fgets保留换行确实会给你一个有用的结果:当且仅当读取了整行的内容时,才会出现换行符。如果你真的很担心(例如,你想调整缓冲区大小并在名称超过指定大小时继续阅读),你也可以使用scanf获得相同的内容 - 而不是使用%*c }对于第二次转换,请使用%c,并传递char的地址。当且仅当你之后读过该字符串的换行符时,才读取整行。