如何从字符串中获取size_t?

Ale*_*lex 4 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,我希望用户能够在可寻址空间中输入任何值).

Sou*_*osh 11

如果你有一个字符串包含一个值输入size_t你想要得到的值,可以使用sscanf()%zu格式说明符读取值,并将其存储到相应的size_t变量.

注意:别忘了检查sscanf()和家人的成功.

伪代码:

size_t len = 0;
if (1 == sscanf(input, "%zu", &len))
printf("len is %zu\n", len);
Run Code Online (Sandbox Code Playgroud)

但是,FWIW,这不会处理溢出情况.如果您的程序应该能够处理的输入长度非常,您可能需要使用strtoumax()并检查溢出,最后将返回的值转换为size_t.请看蓝月亮先生答案.


但是,如果您不介意另一种方法,而不是将输入作为刺痛并将其转换为size_t,则可以直接将输入视为size_t,如同

size_t arr_size = 0;
scanf("%zu", &arr_size);
Run Code Online (Sandbox Code Playgroud)

  • 他也可以将输入作为字符串,然后使用`sscanf` (4认同)

P.P*_*.P. 5

您可以使用以下strtoumax()命令来执行转换:

   #include <inttypes.h>

   intmax_t strtoimax(const char *nptr, char **endptr, int base);
   uintmax_t strtoumax(const char *nptr, char **endptr, int base);
Run Code Online (Sandbox Code Playgroud)

并将结果转换为 size_t。这是一种更好的方法,因为它有助于在给出任意大的输入时检测溢出。

系列scanf()函数无法检测整数溢出,这会导致未定义的行为