字符串声明长度,单位为C.

时间:2013-10-20 15:15:40

标签: c char scanf

所以我正在编写一个小程序(我是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',程序仍然会存储整个值吗?

我的问题是:

  1. scanf是否阻止值记录在邻近区域中 symbol之后的内存块?
  2. 如何阻止用户输入大于SYMBOL_MAX_LEN的值?
  3. scanf是否会自动将空终止字符放入symbol,还是我需要手动执行的操作?

3 个答案:

答案 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终止符。