数组从一开始就不为空

时间:2013-09-01 04:35:00

标签: c

我是C的初学者....我有一些代码:

#include <stdio.h>
#include <string.h>

int main(){
   char str1[100];
   char str2[100];
   char str3[100];
   char str4[100];

   puts(str1)
   puts(str2);
   puts(str3);
   puts(str4);

   return 0; 
}

我得到了结果

2
èý(
‘Q]wØ„ÃîþÿÿÿÀ"bwd&bw

我不知道为什么我的数组从开始就没有空。我必须将第一个元素设置为“\ 0”以清除数组的内容。任何人都可以为我解释。非常感谢。

4 个答案:

答案 0 :(得分:11)

在C中,如果没有为它们赋值,则不会自动初始化局部变量。这里你的数组是未初始化的,这意味着它们在创建后可能包含垃圾。

是的,你需要明确地将它设置为“空”,如:

char str[100];
str[0] = '\0';
// Now you have an empty string of zero length.
assert(strlen(str) == 0);
// But the size is still 100.
printf ("%d", sizeof(str));

或者,您可以在初始化期间创建空字符串(字符数组)。它的大小和长度与上面的例子相同。

char str[100] = "";

答案 1 :(得分:7)

至于为什么它不会自动将字符串归零,这是因为这样做会很昂贵,并且C通常不会做昂贵的事情而你没有明确告诉它做。至少,它必须将每个数组的第一个元素设置为零,并且在很多情况下您不希望或不需要像这样初始化数组。如果C总是为你做这件事,那么你总是会有无用的开销,你无法摆脱它。

作为一般规则,C在后台没有做任何你没有明确告诉它做的事情,所以当你要求一个数组时,它只给你一个数组,而不是触及内容除非你告诉它。它可以为程序员创造更多的工作,但有利于对计算机正在做的事情进行更精细的控制。

有些人会认为总是初始化你的变量是一个很好的编程习惯,并且忘记这种微小的成本,并且很多时候他们会有一个好点,但C故意是一个非常好的灵活的低级语言,它不会强迫你做这样的事情。

答案 2 :(得分:1)

当一个人说“在我的日子......”时,一个人正在变老。但是,“在我的日子里”,人们被指示首先声明变量,然后直接初始化变量。

在您的情况下,您可以在一个声明中一起完成这两项工作,甚至更彻底。

Eric Z的解决方案是正确的,当我使用C-way时我也会使用它。但是为了让你完整,age_pan所描述的是Java本身就是如下:

#include <stdio.h>

int main(int argc, const char * argv[])
{
    char str1[100] = { 0 };
    char str2[100] = { 0 };
    char str3[100] = { 0 };
    char str4[100] = { 0 };

    puts(str1);
    puts(str2);
    puts(str3);
    puts(str4);

    return 0; 
} 

不同之处在于,在Eric Z的解决方案中,只有第一个字符设置为0,这意味着您创建零长度零终止字符串。 Java方法(如上面的代码所示)将每个小字节初始化为0。

Java初始化存在专家和问题。它导致草率编程(有些人称之为编程更简单),如果你不需要初始化则需要时间。另一方面,我知道很少有人需要在初始化时丢失额外的毫秒数。

是否有必要在代码上方声明变量并初始化它们?当然不是。它有用吗?它肯定是。它避免了需要花费大量时间进行调试的各种错误。

顺便说一下,你错过了一个;在puts(str1)之后: - )

亲切的问候, PB

答案 3 :(得分:0)

如果数组不以“空”开头,我认为你没有任何麻烦。在C中,变量以随机值开始。与Java不同,当您声明变量时,JVM将默认启动它。