如何在C语言中从输入中获取字符串

如何在C语言中从输入中获取字符串,c,input,C,Input,这就是我所尝试的: printf("Please venter first string\n"); char str[127]; scanf_s("%s", &str); 得到了这个例外: strcmp.exe中0x0FD2C700(ucrtbased.dll)处引发异常: 0xC0000005:访问冲突写入位置0x00500000 我也尝试这样做: printf("Please venter first string\n"); char str[127]; scanf_s("%d",

这就是我所尝试的:

printf("Please venter first string\n");
char str[127];
scanf_s("%s", &str);
得到了这个例外:

strcmp.exe中0x0FD2C700(ucrtbased.dll)处引发异常: 0xC0000005:访问冲突写入位置0x00500000

我也尝试这样做:

printf("Please venter first string\n");
char str[127];
scanf_s("%d", &str);

在这种情况下也不例外,但我得到了一个长而奇怪的字符串。

让我们从考虑使用标准的
scanf
开始。如果你写信

scanf("%s", &str);
这将是不正确的(尽管它可能会起作用)。将数组传递给函数时,它将衰减为指向第一个元素的指针,这是
scanf
所要求的,因此该行应该是

scanf("%s", str);
scanf_s("%s", str, sizeof str);
如果要限制输入长度以防止缓冲区溢出,可以这样做(比数组长度小一个以允许
nul
终止符)

据称更安全的函数
scanf_s
要求为每种格式类型
%c
%s
%[]
传递一个额外的大小参数,因此下一行(在更正
&
之后)

缺少该参数,编译器应该对此发出警告。代码应该是

scanf("%s", str);
scanf_s("%s", str, sizeof str);
但即使这样也不够。
Xscanf
函数族返回成功输入的值的数量。由于用户(甚至我自己)在输入正确的输入(甚至可能是恶意的)方面出了名的不好,所以您必须始终检查数据输入是否正确。比如

if(scanf_s("%s", str, sizeof str) != 1) {
    // inform user and retry etc. etc.
}
如@chux所述,最好使用
fgets
获取输入,然后通过各种方式处理,如
sscanf
strtok
strep
或通过更直接的字符串分析。在这种情况下,使用
sscanf
,您可以多次尝试处理输入,但使用
scanf
您只能获得一次机会。请注意,
strtok
strep
修改字符串,因此如果需要多次尝试对其进行解码,则需要使用副本


在你的第二个例子中

scanf_s("%d", &str);
您得到了“除了一个长而奇怪的字符串之外没有异常”,但您应该得到一个编译器警告:

警告C4477:“扫描”:格式字符串“%d”要求参数为 类型为“int”,但变量参数1的类型为“char()[127]”


请注意,您没有将
str
初始化为“空字符串”,如果您在输入错误后继续处理您认为是好字符串的内容,则可能会发生不好的事情。

scanf_s(“%s”,&str)
-->
scanf_s(“%s”,str,sizeof(str))
@BLUEPIXY
scanf_s
s
表示“安全”。。。好的,你仍然需要检查警告…@Jean-Françoisfar什么警告?@Jean-Françoisfar我非常同意,这比已经有长度限制功能的
scanf
“如何从C语言输入中获取字符串”?--><代码>fgets(str、sizeof str、stdin)为了快乐的编程生活
scanf_s
scanf
向下延伸。
&str
是对象的地址,
str
衰减到第一个元素的地址,这不一定是同一事物。