1

我是 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

4 回答 4

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] = "";
于 2013-09-01T04:36:22.607 回答
7

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

作为一般规则,C 不会在后台做任何你没有明确告诉它做的事情,所以当你请求一个数组时,它只会给你一个数组,除非你告诉它,否则它不会触及内容它到。它可以为程序员创造更多的工作,但好处是可以更精细地控制计算机正在做什么。

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

于 2013-09-01T04:46:32.260 回答
1

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

在您的情况下,您可以在一个语句中同时进行,甚至更彻底。

Eric Z 的解决方案是正确的,我在使用 C 方式时也会使用它。但为了完整起见,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 初始化有优缺点。它会导致草率的编程(有些人称之为更容易的编程),如果您不需要初始化,则需要时间。另一方面,我知道很少有人需要额外的毫秒来初始化。

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

顺便说一句,您缺少一个 ; 在放置(str1)之后:-)

亲切的问候,PB

于 2013-09-01T08:23:20.127 回答
0

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

于 2013-09-01T04:39:09.480 回答