如何从字符串中获取 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。
我需要从用户输入中获取数组大小。将输入存储为 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。