【问题标题】:C - How to Allocate Memory to string input with variable length?C - 如何为可变长度的字符串输入分配内存?
【发布时间】:2020-06-08 06:03:24
【问题描述】:

我知道在我的 C 代码的内存使用下存在一个简单的错误,因为在命令行上接收到用户输入后,简单 for 循环中的迭代器发生了巨大变化:

int i = 1;
char input[] = "";
for (i = 1; i <= 5; i++) {
    printf("i  %d\n> ", i);
    scanf("%s", input);
    printf("input %s\ni %d\n", input, i);
}

输出应该足够简单:

i 1
> <receive input>
input <input>
i 1

重复5次。

但是,迭代器“i”会更改为任何内容,而不是收到任何输入时的预期值。

示例输出:

i  1
> 45
input 45
i 53

我有一种预感,这来自编译器中的内存访问。有什么帮助!

【问题讨论】:

  • 回想一下,每个 C 字符串都必须为 nul-terminating 字符 '\0' (ASCII 0) 提供空间,这需要在字符串末尾增加 1 个字符除了您打算存储的每个字符。 (这就是函数如何知道字符串的结尾在哪里...)char input[] = ""; 声明并将 1-char 数组初始化为 empty-string (只是 '\0' 字符)。一旦声明数组大小是固定的,所以它永远不能存储字符串(empty-string除外),最多可以存储1个字符(字节)。
  • 另外,除非您检查返回,否则您无法正确使用任何输入功能。 Using scanf Correctly 的基本解释可能会有所帮助。

标签: c gcc


【解决方案1】:

scanf("%s", input);

来自 scanf 的文档:

%s 匹配不是空白字符的字节序列。 应用程序应确保相应的参数是指向 char、signed char 或 unsigned char 数组的初始字节的指针足够大以接受序列和终止空字符代码,自动添加。

你就是应用程序。 char input[] = ""; 只有 1 个字节大。
由于空终止符,scanf 返回的任何字符都将导致input 溢出。并将覆盖内存中的下一个变量。

试试:

char input[100] = "";
scanf("%100s", input);

【讨论】:

    【解决方案2】:

    看看你的局部变量是如何声明的:

    int i = 1;
    char input[] = "";
    

    input 是一个长度为零的字符串,并且没有为您要请求的输入分配空间。当你这样做时:

    scanf("%s", input);
    

    输入被写入input 指向的数组中,但由于没有为此保留空间,所以input 指向的数组之后的任何内容都会被覆盖。在这种情况下,就是I

    要解决此问题,您需要确保在您放置输入的位置有足够的空间用于输入。此外,您应该限制输入的允许长度,以便用户输入的数据不能超过您保留的空间大小。

    【讨论】:

      猜你喜欢
      • 2020-09-06
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 2012-11-01
      • 2019-10-07
      • 2020-01-29
      • 1970-01-01
      • 2011-12-02
      相关资源
      最近更新 更多