我知道在 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/