如何从字符串中获取size_t?

时间:2015-09-01 07:03:25

标签: c string size-t

我需要从用户输入中获取数组大小。我将输入存储为size_t似乎很自然,但是找不到任何合适的strto...()函数。我刚刚使用strtoull(),因为unsigned long long保证至少为64位而且我仍在使用C99。但我想知道从字符串中获取size_t的最佳方法是什么 - 例如,在ANSI C中。

编辑:

为了澄清,我不希望字符串长度!用户将以字符串的形式输入大缓冲区的大小,例如"109302393029"。我需要获得该号码并存储为size_t。当然我可以使用strtol()甚至是atoi(),但它看起来像一个笨拙的黑客(size_t可能比int拥有更大的值,我希望用户能够在可寻址空间中输入任何值。)

3 个答案:

答案 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