Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不’;我们不需要循环在C中打印字符串吗?_C_String_Pointers_Printf_Size - Fatal编程技术网

为什么不’;我们不需要循环在C中打印字符串吗?

为什么不’;我们不需要循环在C中打印字符串吗?,c,string,pointers,printf,size,C,String,Pointers,Printf,Size,我不明白为什么我们不在for循环中打印字符串?在正常情况下,我们需要在for循环中打印数组。例如,如果我们想要打印整数数组。它将是这样的: int a[n]; for (i = 0; i < n; i++){ printf("%d", a[i]); } 写数组的名称就足够了。 编辑:似乎我没有正确地问我的问题,因为你们中的一些人写了与我的问题无关的答案。我编辑了我的问题。字符串以空字符'\0'结尾,这就是为什么即使不显式地传递其长度,也可以知道字符串何时结束。区别在于C样式的字

我不明白为什么我们不在for循环中打印字符串?在正常情况下,我们需要在for循环中打印数组。例如,如果我们想要打印整数数组。它将是这样的:

int a[n];

for (i = 0; i < n; i++){
    printf("%d", a[i]);
}
写数组的名称就足够了。
编辑:似乎我没有正确地问我的问题,因为你们中的一些人写了与我的问题无关的答案。我编辑了我的问题。

字符串以空字符
'\0'
结尾,这就是为什么即使不显式地传递其长度,也可以知道字符串何时结束。

区别在于C样式的字符串(是字符数组)以零结尾,而int数组通常不以零结尾

理论上,您还可以创建一个以零结尾的int数组,并在循环中打印该数组:

int a[] = {5,7,3,0};

for (i=0;a[i]!=0;i++)
{
   printf("%d",a[i])
}

但是,以零结尾的int数组的问题是,数字0可能是一个有意义的值,因此当遇到该值时,您无法确定它是否真的是数组的结尾。但是,对于字符串,0并不表示有意义的值,因此您可以合理地确定已到达字符串的结尾。

Y我们的示例远非类似。
%d
表示单个整数,而
%s
表示整个(但仍然是单个)字符串

您也没有将数组的大小
n[]
传递给
printf
而是调用
printf
n
次。打印一个
int
就像打印一个字符串一样

实际字符串长度事先未知,而是
printf
迭代字符串,直到遇到
\0
终止符。等效于:

for( int i = 0; s[i] != '\0'; i++)
{
    printf( "%c", s[i] ) ;
}
因为

char s[100] = " Hello ";
相当于:

char s[100] = { ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\0' } ;

字符串同时是多个字符。不能从字符串中请求特定字符。如果要这样做,必须将其引用为如下字符数组

for (i = 0; i < n; i++){
     printf("%c", s[i]);
}
(i=0;i{ printf(“%c”,s[i]); }
这是因为您已经向printf函数提供了参数“%s”,printf函数已经有了一个告诉它如何打印字符串的定义。
希望有帮助。

因为C中的字符串以一个特殊字符“\0”结尾,这让程序知道它的结尾。任何优秀的初学者教程都应该涵盖这一点。也许你需要一本更好的书/源或任何你正在使用的资源。就像其他人所说的。如果你在C中,你应该能够键入“man 3 printf”深入阅读printf(及其相关函数)的linux系统。或者,或者。您当然可以这样做,正如下面提供的许多示例所示。调用printf是有代价的。代价在于printf本身。因此,最好只调用printf,尽可能地最小化。您可以尝试逐字符和一起打印一个大字符串,然后比较它们的速度。仍然有一个循环,但它在
printf()内
@subhanceo欢迎您,不过由于您对问题做了一些修改,所以答案没有什么意义。
for (i = 0; i < n; i++){
     printf("%c", s[i]);
}