为什么我们不需要 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 循环。
我不明白为什么我们不必在 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 循环。