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