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