如何从字符串中获取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);