1

我对 C++ 中的字符串有疑问。根据下面的代码,我想知道循环将在哪里停止。它会在索引 3 或索引 4 中取 null 吗?

#include <cstdio>

int main ( ) {

  char name [20] = "Foo";

  name [4] = '\0';

  for (int i = 0; name[i] != '\0'; i++) {

       printf("This is the value of i so far in the loop : %d \n",i);
  }

  printf("This is the value of i : %d \n",i);

 return 0;

}

我问这个的原因是,我不明白为什么在我的作业中他们给了我们这样的东西。是否有任何理由在索引 4 中添加“\0”?

4

3 回答 3

2

“Foo”实际上是 {'F','o','o','\0'},适合索引 0,1,2,3。索引 4 到 19 是默认初始化的(因此为 0-ed)。并且索引 4 稍后分配有 '\0'。

当第一个 '\0' 匹配时循环结束,因此打印值 0,1,2。在循环之外保持i...咳咳..未定义!(它在循环范围内声明),但如果你的编译器没有清理你很可能会打印 3。

一个典型的 C++ 示例(注意#include<cstdio>,但从未引用过 std...),由一位 C 语言教师教授。向他表示祝贺!

于 2012-04-08T06:34:40.530 回答
1

是否有任何理由在索引 4 中添加“\0”?

绝对没有。

这一行:

char name [20] = "Foo";

初始化数组如下:

name[0] <-- 'F'    First char of "Foo"
name[1] <-- 'o'    Second char of "Foo"
name[2] <-- 'o'    Third char of "Foo"
name[3] <-- '\0'   Fourth char of "Foo"
name[4..19] <-- 0  Extra spaces in array get zero-filled

所以,这一行:

  name [4] = '\0';

将零写入已经保证为零的位置。

因此,索引 3 处有一个零(它是“Foo”中的最后一个字符)。在所有位置 4-19 中都有一个零(因为初始化器小于数组)。而且,冗余地,有一个零写入索引 4。

于 2012-04-08T06:37:41.110 回答
-1

我认为应该是3:

name[0]='F' name[1]='o' name[2]='o' name[3]='\0' name[4]='\0'
于 2012-04-08T06:06:02.260 回答