繁体   English   中英

C中的字符串解串长度

[英]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”,程序仍将存储整个值吗?

我的问题是:

  1. scanf是否不会阻止在symbol后将值记录在相邻的内存块中?
  2. 如何防止用户输入大于长度SYMBOL_MAX_LEN的值?
  3. scanf是将空终止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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM