如何从字符串中获取 size_t?

How to get size_t from string?

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

编辑:

澄清一下,我不需要字符串长度!用户将以字符串的形式输入大缓冲区的大小,例如"109302393029"。我需要获取该号码并将其存储为 size_t。当然,我可以使用 strtol() 甚至 atoi(),但这似乎是一个笨拙的 hack(例如,size_t 可能比 int 包含更大的值,我希望用户能够在可寻址 space).

中输入任何值

如果您有一个 string 输入包含 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() and check for overflow, finally casting the returned value to size_t. Please see Mr. Blue Moon's


不过,如果你不介意另一种方法,而不是将输入作为sting并将其转换为size_t,你可以直接将输入作为size_t,喜欢

size_t arr_size = 0;
scanf("%zu", &arr_size);

只需将输入作为 unsigned int 并将其转换为 size_t,或者只是:

size_t length;
scanf("%zu", &length);

您可以使用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