在 C 中限制字符串长度的问题

Problems with limiting a string length in C

我对编码还比较陌生,不明白为什么我会收到一个简单的 scanf 抛出的异常。

char word[15];

printf("\nEnter a word: ");
scanf_s("%15s", word);

scanf_s 需要第三个参数,sizeof 缓冲区:

scanf_s("%s", word, sizeof(word));

scanf_s 可以是 Microsoft-specific 或 C 标准定义的,但并不是每个 C 实现中都必须实现的。根据您使用的是哪个,您需要将 sizeof() 参数转换为 unsigned(Microsoft 实现)或将其转换为 rsize_t(C 标准)。

相关:

  • Difference between scanf and scanf_s
  • String input using C scanf_s

请注意,您还应该检查 scanf_s 的 return 值。

if ( scanf_s("%s", word, (unsigned) sizeof(word)) != 1 )
{
    // error routine.
}

如果您想编写可移植代码,请改用fgets()

if ( !fgets(word, sizeof(word), stdin) )
{
   // error routine.
}

字符串

C 中的字符串使用字符数组表示。

这些数组必须使用空字符终止 [=10=],因为 C 标准库是假设您将以这种方式编写字符串。

当您定义数组 char word[15] 时,您分配了足够的内存来存储 14 个字符加上空字符。

转换说明符 s 的函数 scanf_s 需要一个附加参数来指定输入缓冲区的大小。

你可以这样写(如果是scanf_s的微软实现)

scanf_s("%14s", word, ( unsigned )sizeof( word ) );

或者(如果是标准的scanf_s)

scanf_s("%14s", word, ( rsize_t )sizeof( word ) );

此外,长度应指定为等于 sizeof( word ) - 1 即等于 14。为终止零字符保留一个字符 '[=16=]'.

你就快完成了!正如您可能已经知道的那样,C 中的字符串使用以 NULL 字符 ('\0') 结尾的字符数组在内存中存储和管理。

简而言之,如果您想将字符串的长度限制为 15 个字符,您只需将其加 1 以解决 NULL 终止字符,瞧!您的代码有效。编码员的记忆设备:

Desired MAX number of character = Desired MAX number of character + 1;
// or the shortened 
the Desired MAX number of character += 1;

此外,请记住,如上所述,scanf_s 需要一个额外的参数来指定输入缓冲区的大小。所以你的代码看起来像:

scanf_s("%16s", word, (unsigned)sizeof( word ));

希望对您有所帮助,祝您编码愉快!