【问题标题】:Why are old values in an array still present? [closed]为什么数组中的旧值仍然存在? [关闭]
【发布时间】:2018-06-09 19:03:34
【问题描述】:

请解释这个输出。问题与scanf相同。如何每次都重新初始化数组?
输入:

HelloWorld
Tech

输出:

eo  
Tech
TW

代码:

#include<stdio.h>  
#include<string.h>  
int main()  
{  char c[1024]; int i,d=1;  
 gets(c);  
 printf("%c%c\n",c[d],c[d+5]);  
 gets(c);    
 puts(c);  
 printf("%c%c\n",c[0],c[4+d]);  
 return 0;  
 }

【问题讨论】:

标签: c arrays string


【解决方案1】:

在 C 中,字符串存储为 null-terminated 字符数组。这意味着有很多方法可以表示同一个字符串:就字符串的值而言,忽略第一个空字节之后的字符数组中的所有内容。

当第一个gets 调用读取HelloWorld 时,它将字符'H' 存储在c[0] 中,'e' 中存储c[1],...,'d'c[9] 和0(这是一个空c[10] 中的字节,而不是 '0')。 c[11]c[1023]的内容不变。

当第二个gets调用读取Tech时,它将字符'T'存储在c[0]中,'e'c[1]中,'c'c[2]中,'h'中@9876@45中和 c[4] 中的 0。 c[5]c[1023] 的内容不变。特别是,c[5] 仍然具有由第一个 gets 调用设置的值 W

如果您习惯于高级语言,您可能会期望gets 分配新的存储空间,或者执行看起来像字符串访问的操作可以保证您实际访问的是字符串,但这些都不是真的.

正如您可能从将字符数组传递给gets 的事实猜到的那样,它只是写入该字符数组,它不会分配新的存储空间。当gets 读取一个 4 字节字符串时,它会写入该 4 字节字符串加上终止的空字节,并且不会触及这 5 个字节之后的任何内容。事实上,gets 甚至不知道数组的大小(这就是为什么 gets 在实践中实际上无法使用并且已从当前版本的 C 语言中删除:如果您输入的行太长数组,它将覆盖内存中数组之后的任何内容)。

c[5] 访问数组 c 在位置 5 的元素。这恰好在字符串之外,但这与数组访问的操作方式无关。这是 array 访问,而不是 string 访问。 C 本身并没有真正的字符串:它用字符数组来伪造它们。字符串操作函数将它们的参数视为字符串(即它们只查找第一个空字节)。但是数组访问只是数组访问,程序员不能越界访问字符串或数组。

【讨论】:

    【解决方案2】:

    请更正您的指示。您可能想使用 2、3、4 个空格,但 1 看起来是错误的。我没有看到 string.h 库的任何用途。


    数组没有被清除,但是 0..3 个字符被替换为新的字符并且位置 4 的字符是\0。这就是为什么您可以从该数组中位置 5 的先前输入的值中读取字符的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多