所以我正在编写一个小程序(我是C的新手,来自C ++),我想要输入一个最大长度为十的字符串。
我将字符数组声明为
#define SYMBOL_MAX_LEN 10 //Maximum length a symbol can be from the user (NOT including null character)
.
.
.
char symbol[SYMBOL_MAX_LEN + 1]; //Holds the symbol given by the user (+1 for null character)
为什么我在使用时会这样:
scanf("%s", symbol); //Take in a symbol given by the user as a string
我可以输入'01234567890',程序仍然会存储整个值吗?
我的问题是:
symbol
之后的内存块?SYMBOL_MAX_LEN
的值?symbol
,还是我需要手动执行的操作?答案 0 :(得分:2)
您可以将scanf()
的字符数限制为:
#include <stdio.h>
int main(void) {
char buffer[4];
scanf("%3s", buffer);
printf("%s\n", buffer);
return 0;
}
示例输出:
paul@local:~/src/c/scratch$ ./scanftest
abc
abc
paul@local:~/src/c/scratch$ ./scanftest
abcdefghijlkmnop
abc
paul@local:~/src/c/scratch$
scanf()
会为您添加终止'\0'
。
如果您不想对格式字符串中的长度进行硬编码,则可以动态构造它,例如:
#include <stdio.h>
#define SYMBOL_MAX_LEN 4
int main(void) {
char buffer[SYMBOL_MAX_LEN];
char fstring[100];
sprintf(fstring, "%%%ds", SYMBOL_MAX_LEN - 1);
scanf(fstring, buffer);
printf("%s\n", buffer);
return 0;
}
为避免疑问,scanf()
通常是处理输入的可怕功能。 fgets()
对于这类事情要好得多。
答案 1 :(得分:1)
我可以输入'01234567890',程序仍然会存储整个值?
这是因为你很不走运,你得到了理想的结果。这将调用未定义的行为。
scanf
是否阻止值在符号后的相邻内存块中记录?
没有。
如何阻止用户输入长度超过SYMBOL_MAX_LEN的值?
使用fgets
。
scanf会自动将空终止字符放入符号中,还是我需要手动执行的操作?
是
答案 2 :(得分:1)
scanf
是否阻止值在符号后的相邻内存块中记录?
据我所知,没有。
如何阻止用户输入大于SYMBOL_MAX_LEN的值?
使用fgets
等缓冲区安全功能。
scanf
是否会自动将空终止字符放入符号中,还是我需要手动执行的操作?
仅当大小足以放置nul
终止符时。例如,如果您的数组的长度为10,并且您输入了10个字符,那么它将如何放置nul
终止符。