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

Zac*_*ith 5 c

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

char mystring[50];
Run Code Online (Sandbox Code Playgroud)

'50'是字符数.

但是,如果用户要输入字符串的内容(通过scanf("%s",mystring);),那么正确的过程是什么?我把它留下来,

char mystring[0];
Run Code Online (Sandbox Code Playgroud)

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

或者我这样做,

char mystring[400];
Run Code Online (Sandbox Code Playgroud)

最多可以输入400个字符供用户输入?

pou*_*def 6

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

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

所以,第1点:你应该总是为你的字符串分配一个大小.我可以想到很少的情况(没关系,没有)你想说的char mystring[0]而不是char *mystring.

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

char mystring[512];
scanf("%s", mystring);
Run Code Online (Sandbox Code Playgroud)

如果用户输入超过511个字符(因为第512个字符为\ 0),您将超出数组的范围.解决这个问题的方法是:

scanf("%511s", mystring);
Run Code Online (Sandbox Code Playgroud)

这就是说,如果输入的数量超出预期,C就没有自动调整字符串大小的工具.这是你必须手动完成的事情.

解决这个问题的一种方法是使用fgets().

你可以说:

while (fgets(mystring, 512, stdin))
{
   /* process input */
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用sscanf()进行解析 mystring

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

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