在 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 ));
希望对您有所帮助,祝您编码愉快!
我对编码还比较陌生,不明白为什么我会收到一个简单的 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 ));
希望对您有所帮助,祝您编码愉快!