嗨我在连续读取两个带空格的字符串时使用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
地址的输入根本没有被采用..也许它将返回键作为输入?
答案 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
的地址。当且仅当你之后读过该字符串的换行符时,才读取整行。