我是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”以清除数组的内容。任何人都可以为我解释。非常感谢。
答案 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将默认启动它。