在 C 中用指针循环
loop with pointer in C
我正在用 c 中的循环进行测试,我遇到了一个 post 关于循环中的指针 (for(foo = bar; *foo; foo++)
)。
我尝试用这些知识进行测试,并做出了这个:
int main() {
char a[9] = "test test";
char *b;
for(b = a; *b; b++)
printf("%c", *b);
return 0;
}
我编译了这个 (gcc test.c
),然后 运行 它并得到了以下输出:test test‼ aest test¶ ast test§ at test▬ a test↨ atest↑ aest↓ ast→ ata∟ a aa
我把char a[9]
改成char a[10]
,假设跟[=16=]
有关系,然后得到test testest testst testt test testtesteststt
.
为什么会这样?我以为这个循环会在 9 个循环后结束,因为提供的字符串中有 9 个字符。
你的问题就在这里
char a[9] = "test test";
"test test"
作为一个 c 字符串占用 10 个字节:9 个用于字符,一个用于终止 '[=16=]'
字符。
做:
char a[] = "test test";
即。让编译器算出字符串占用多少内存。
为什么会出现这个问题?
因为 C 运行时在看到 '[=16=]'
字符时会检测到字符串的结尾。你还没有,所以运行时代码从字符串的末尾开始运行,并一直运行直到遇到 '[=16=]'
你也应该这样做
printf("%s\n", b);
这样每个循环打印在一行上。不做printf(<string>)
这是自找麻烦
好的,下一个问题是 - 为什么它不打印 "test test"
.
char a[9] = "test test";
char *b;
for(b = a; *b; b++)
printf("%s\n",b);
return 0;
让我们做第一个循环。在打印语句处:
b
是一个字符指针,指向字符串 中的第一个'T'
printf("%s\n", b)
将从该点开始打印 string,即 "Test Test"
第二次循环,同一个地方
b
现在指向 'e'
字符
printf("%s\n", b)
将从该点开始打印 string,即 "est Test"
第三
b
现在指向 's'
字符
printf("%s\n", b)
将从该点开始打印 string,即 "st Test"
都清楚了吗?
如果要打印字符串char by char do
char a[9] = "test test";
char *b;
for (b = a; *b; b++)
printf("%c\n", *b);
return 0;
那 printf
说 'print one character, the character pointed at by b.'
我正在用 c 中的循环进行测试,我遇到了一个 post 关于循环中的指针 (for(foo = bar; *foo; foo++)
)。
我尝试用这些知识进行测试,并做出了这个:
int main() {
char a[9] = "test test";
char *b;
for(b = a; *b; b++)
printf("%c", *b);
return 0;
}
我编译了这个 (gcc test.c
),然后 运行 它并得到了以下输出:test test‼ aest test¶ ast test§ at test▬ a test↨ atest↑ aest↓ ast→ ata∟ a aa
我把char a[9]
改成char a[10]
,假设跟[=16=]
有关系,然后得到test testest testst testt test testtesteststt
.
为什么会这样?我以为这个循环会在 9 个循环后结束,因为提供的字符串中有 9 个字符。
你的问题就在这里
char a[9] = "test test";
"test test"
作为一个 c 字符串占用 10 个字节:9 个用于字符,一个用于终止 '[=16=]'
字符。
做:
char a[] = "test test";
即。让编译器算出字符串占用多少内存。
为什么会出现这个问题?
因为 C 运行时在看到 '[=16=]'
字符时会检测到字符串的结尾。你还没有,所以运行时代码从字符串的末尾开始运行,并一直运行直到遇到 '[=16=]'
你也应该这样做
printf("%s\n", b);
这样每个循环打印在一行上。不做printf(<string>)
这是自找麻烦
好的,下一个问题是 - 为什么它不打印 "test test"
.
char a[9] = "test test";
char *b;
for(b = a; *b; b++)
printf("%s\n",b);
return 0;
让我们做第一个循环。在打印语句处:
b
是一个字符指针,指向字符串 中的第一个printf("%s\n", b)
将从该点开始打印 string,即"Test Test"
'T'
第二次循环,同一个地方
b
现在指向'e'
字符printf("%s\n", b)
将从该点开始打印 string,即"est Test"
第三
b
现在指向's'
字符printf("%s\n", b)
将从该点开始打印 string,即"st Test"
都清楚了吗?
如果要打印字符串char by char do
char a[9] = "test test";
char *b;
for (b = a; *b; b++)
printf("%c\n", *b);
return 0;
那 printf
说 'print one character, the character pointed at by b.'