我需要从用户输入中获取数组大小.我把输入存储起来似乎很自然size_t,但是strto...()找不到任何合适的功能.我刚刚使用过strtoull(),因为unsigned long long保证至少64位,我还是使用C99.但我想知道什么是size_t从字符串中获取的最佳方法- 比如,在ANSI C中.
编辑:
为了澄清,我不希望字符串长度!例如,用户将以字符串的形式输入大缓冲区的大小"109302393029".我需要得到那个号码并存储为size_t.当然我可以使用strtol()甚至atoi(),但它看起来像一个笨拙的黑客(例如,size_t可能拥有更大的值int,我希望用户能够在可寻址空间中输入任何值).
Sou*_*osh 11
如果你有一个字符串包含一个值输入size_t你想要得到的值,可以使用sscanf()与%zu格式说明符读取值,并将其存储到相应的size_t变量.
注意:别忘了检查sscanf()和家人的成功.
伪代码:
size_t len = 0;
if (1 == sscanf(input, "%zu", &len))
printf("len is %zu\n", len);
Run Code Online (Sandbox Code Playgroud)
但是,FWIW,这不会处理溢出情况.如果您的程序应该能够处理的输入长度非常大,您可能需要使用strtoumax()并检查溢出,最后将返回的值转换为size_t.请看蓝月亮先生的答案.
但是,如果您不介意另一种方法,而不是将输入作为刺痛并将其转换为size_t,则可以直接将输入视为size_t,如同
size_t arr_size = 0;
scanf("%zu", &arr_size);
Run Code Online (Sandbox Code Playgroud)
您可以使用以下strtoumax()命令来执行转换:
#include <inttypes.h>
intmax_t strtoimax(const char *nptr, char **endptr, int base);
uintmax_t strtoumax(const char *nptr, char **endptr, int base);
Run Code Online (Sandbox Code Playgroud)
并将结果转换为 size_t。这是一种更好的方法,因为它有助于在给出任意大的输入时检测溢出。
系列scanf()函数无法检测整数溢出,这会导致未定义的行为。