在 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.'