gpt4 book ai didi

arrays - 在使用字符串数组时使用 scanf_s 的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-05 01:53:45 27 4
gpt4 key购买 nike

char array1[10];
scanf_s("%9s", array1, (unsigned)_countof(array1);

(unsigned)_countof(array1) 是什么意思?

与使用 scanf_s("%9s", array1, sizeof(array1); 有什么不同?

都有效,但我想更确定地了解它

最佳答案

What's the correct way to use scanf_s in using string arrays?

scanf_s() "%9s" 不适用于字符串数组。它用于读取文本并保存为单个字符串,这是一个带有空字符字符数组

它的正确使用很复杂,因为 MSVC 期望计数参数中的类型与 C11 不同。在 C11 及更高版本中,scanf_s() 是标准库的可选函数,未被广泛接受。

// MSVC - type unsigned expected, hence the cast.
scanf_s("%9s", array1, (unsigned)_countof(array1);

// C11 - type size_t expected
scanf_s("%9s", array1, sizeof array1 / sizeof array1[0]);

正确使用任一种代码都会检查 scanf_s() 的返回值

if (1 == scanf_s("%9s", ...)) Success();
else Fail();

What's mean of (unsigned)_countof(array1)?

_countof() 是一个 MSVC 宏,相当于 (sizeof(array) / sizeof(array[0])) .当传递一个数组时,它返回数组中元素的数量作为 size_t 类型。与 MSVC scanf_s() 一样,转换为 unsigned 会获得预期的类型。该值可能会因强制转换而被截断 - 这是大型数组的罕见问题。


what's different from use scanf_s("%9s", array1, sizeof(array1));?

sizeof(array1) 的预期类型是 size_t 而不是 MSVC 中预期的 unsigned - 导致未定义的行为。当 size_tunsigned 时,没问题,否则就是真正的问题。

概念值是错误的。它应该是数组元素count,而不是数组的字节size。此处作为 sizeof(char)==1 可以,但如果代码移动到使用宽字符则错误。


both worked

代码不可移植。它可能在 OP 的情况下“有效”,但缺乏可移植性。


考虑 scanf_s()、scanf() 的替代方案,例如 fgets()

关于arrays - 在使用字符串数组时使用 scanf_s 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71044884/

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