c - 同时使用两个 scanf(%s) 有什么问题

标签 c string scanf

为什么第二个 scanf 不接受任何输入? %s cancatanae 是字符串吗?

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
char string1[50];
char string2[50];


scanf("%[^\n]s",string1);
scanf("%[^\n]s",string2);

printf("\nfirst string :%s \n",string1);
printf("\nsecnd string :%s \n",string2);

return 0;
}

输入:这是 BBC [输入]

输出:第一个字符串:这是 bbc 第二个字符串:{一些字符符号}

最佳答案

"%[^\n]s" 告诉 scanf “吃掉”所有不是换行符的字符并将它们放入参数中;这意味着,在第一个 scanf 返回后,它将留下换行符,使其停止在读取缓冲区中。下一个 scanf 找到它并立即停止读取 - 毕竟,您告诉它读取到第一个换行符!

这里的解决方案可以是使用 "%[^\n]s\n",它甚至“吃掉”字符串后面的换行符,甚至是 "%[^\n]s ",其中的空格是“神奇的”,因为它告诉 scanf 吃掉它能找到的所有其他空格,其中包括换行符(但请注意,这是一个如果您希望能够在下一行中读取空字符串,那么这是个坏主意)。

更简单的是,您可以简单地使用 fgets(string1, sizeof(string1), stdin),这与 scanf%s 不同,可以防止缓冲区溢出(是的,您甚至可以使 %s 安全,但需要更多工作)。请注意,fgets 甚至将尾随换行符放入字符串中。

关于c - 同时使用两个 scanf(%s) 有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38159991/

相关文章:

c - "not all control paths return a value”在这个程序中意味着什么?

c++ - 为什么树向量化会使这种排序算法慢2倍?

c++ - 使用 gammu 时自动检测调制解调器端口

c - C 中的链表打印额外的零

Python - 从字符串中提取数字和逗号(使用 re.sub)

C 扫描输入字符串保存到错误的变量

java - EditText 到 String 到 double 转换及计算错误

java - 由此生成了多少个 Java 对象 - new String ("abcd")

c - 如果输入是字符,为什么这段代码会输出 64?

c - Scanf 跳过 C 中的每个其他 while 循环