c - 确定 C 中 Char 字符串的长度 - 如果用户输入字符串的内容

标签 c

我知道在 C 中你可以像下面这样声明一个字符串和字符数,

char mystring[50];

'50' 是字符数。

但是,如果用户要输入字符串的内容(通过 scanf("%s", mystring);),正确的步骤是什么?我是否将其保留为

char mystring[0];

将其保留为“0”,因为我不知道用户将输入多少个字符?

或者我做,

char mystring[400];

最多允许用户输入 400 个字符?

最佳答案

您遇到了 scanf() 和 %s 的确切问题 - 当您不知道有多少输入时会发生什么?

如果您尝试运行 char mystring[0];,您的程序将编译得很好。但是你总是会出现段错误。您正在创建一个大小为 0 的数组,因此当您尝试将某些内容放入 该数组时,您将立即超出字符串的范围(因为没有分配内存) - 这是段错误。

所以,第 1 点:您应该始终为您的字符串分配一个大小。我能想到在极少数情况下(好吧,没有)您想说 char mystring[0] 而不是 char *mystring

接下来,当您使用 scanf 时,您永远不想使用“%s”说明符 - 因为这不会对字符串的大小进行任何边界检查。所以即使你有:

char mystring[512];
scanf("%s", mystring);

如果用户输入超过 511 个字符(因为第 512 个字符是\0),您将超出数组的范围。补救方法是:

scanf("%511s", mystring);

这就是说,如果输入多于您的预期,C 没有自动调整字符串大小的工具。这是您必须手动完成的事情。

处理此问题的一种方法是使用 fgets() .

你可以说:

while (fgets(mystring, 512, stdin))
{
   /* process input */
}

然后您可以使用 sscanf() 来解析 mystring

尝试上面的代码,使用长度为 5 的字符串。读取 4 个字符后,该代码再次循环以检索输入的其余部分。 “处理”可能包括将字符串重新分配为更大大小的代码,然后附加来自 fgets() 的最新输入。

上面的代码并不完美 - 它会使您的程序循环并处理任何无限长度的字符串,因此您可能希望对此设置一些内部硬限制(例如,最多循环 10 次)。

关于c - 确定 C 中 Char 字符串的长度 - 如果用户输入字符串的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1814557/

相关文章:

c++ - 在 printf 上,用字符大小填充内容

c - printf 中不存在扫描的 0

c - 我不明白如何在简单计算器中输入或划分 float 和 int

c - 将 yyin 指向 mfcalc 示例中的 FILE*

与数组进行比较并返回丢失的项目?

c - 数组内某个范围内的随机数

从 system() 更改为 exec(),它会加速我的代码吗?

QEMU 可以在 VMWare 或 VirtualBox 上运行吗?

更改控制台窗口的窗口过程

c - 如果使用 __INLINE__,速度会提高多少?