gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:15:25 26 4
gpt4 key购买 nike

这是我尝试过的:

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

得到这个异常:

Exception thrown at 0x0FD2C700 (ucrtbased.dll) in strcmp.exe: 0xC0000005: Access violation writing location 0x00500000.

我也试试这个:

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

在这种情况下也不异常(exception),但我得到了又长又奇怪的字符串。

最佳答案

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

scanf("%s", &str);

那是不正确的(尽管它可能有效)。将数组传递给函数时,它会衰减为指向第一个元素的指针,这是 scanf 所需要的,所以该行应该是

scanf("%s", str);

如果你想限制输入长度以防止缓冲区溢出,它可以像这样(比数组长度少一个以允许 nul 终止符)

scanf("%126s", str);

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

scanf_s("%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 获取输入,然后通过各种方式对其进行处理,例如sscanfstrtokstrsep 或通过更直接的字符串分析。在这种情况下,使用 sscanf,您可以多次尝试处理输入,但使用 scanf,您只有一次机会。请注意,strtokstrsep 会修改字符串,因此如果您需要多次尝试对其进行解码,则需要使用副本。


在你的第二个例子中

scanf_s("%d", &str);

你得到“没有异常(exception),但有一个又长又奇怪的字符串”,但你应该得到一个编译器警告:

warning C4477: 'scanf_s' : format string '%d' requires an argument of type 'int ', but variadic argument 1 has type 'char ()[127]'

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

关于c - C语言如何从输入中获取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46981849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com