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