为什么我们不需要 for 循环来在 C 中打印字符串?

Why don’t we need for loop to print strings in C?

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

int a[n];

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

但是对于像这样的字符串:

char s[100] = " Hello ";
printf("%s\n", s);

写数组名即可。 编辑:似乎我没有正确地问我的问题,因为你们中的一些人写了与我的 question.I 编辑我的问题无关的答案。

字符串以空字符 '[=10=]' 结束,这就是即使不显式传递其长度也可以知道字符串何时结束的方式。

区别在于 C 风格的字符串(char 数组)以零结尾,而 int 数组通常不以零结尾。

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

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

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

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

你的例子远非类似。 %d 指的是 单个 整数,而 %s 指的是整个(但仍然是单个)字符串。

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

实际字符串长度未知 先验,而是 printf 迭代字符串直到遇到 [=21=] 终止符。相当于:

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

因为

char s[100] = " Hello ";

相当于:

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

字符串同时是多个字符。您不能从字符串中请求特定字符。如果你想这样做,你必须将它作为一个字符数组来引用,就像这样

for (i = 0; i < n; i++){
     printf("%c", s[i]);
}

这是因为您已经向 printf 函数提供了参数“%s”,该函数已经定义了如何打印字符串。 希望对你有帮助。

其中一个原因是char只占用1个字节的内存,当你按下一个字符时,数组的第一个索引被完全填满,然后移动到下一个,直到遇到NULL字符。对于大小超过 1 个字节且取决于机器的整数数组,情况并非如此。所以你不能通过按小于最大范围的数字来逃避第一个索引。如果您尝试这样做,它只会将您的数字存储在第一个索引中,因此那里需要一个 for 循环。