[英]String decleration length in C
所以我正在写一个小程序(我是C语言的新手,来自C ++),我想输入最大长度为10的字符串。
我声明一个字符数组为
#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
自动放入symbol
,还是我需要手动执行某些操作? 您可以限制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()
更好。
我可以输入“ 01234567890”,程序仍将存储整个值吗?
这是因为您很不幸无法获得理想的结果。 这将调用未定义的行为。
scanf
是否不会阻止在符号后将值记录在相邻的内存块中?
没有。
如何防止用户输入大于长度SYMBOL_MAX_LEN的值?
使用fgets
。
scanf是将空终止符自动放入符号中,还是我需要手动执行某些操作?
是
scanf
是否不会阻止在符号后将值记录在相邻的内存块中?
据我所知,没有。
如何防止用户输入大于长度SYMBOL_MAX_LEN的值?
通过使用缓冲区安全功能(如fgets
。
scanf
将空终止符自动放入符号中,还是我需要手动执行某些操作?
仅当大小足以放入nul
终止符时。 例如,如果您的数组长度为10,并且您输入了10个字符,它将如何放置nul
终止符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.