for循环中的数组索引

时间:2013-10-14 03:59:13

标签: c++ arrays

我是c +的新手,遇到了一个我不知道该怎么做的问题。当我看到下面的代码时,我正在书中做一些例子。

for(int i=0;string[i];i++){
    cout<<string[i];
}

这里代替第二个参数的布尔值,该人已经给出了数组索引。基于该方法,我运行了以下代码,但它没有用。

char string[50] ="This is a test!";

for(int i=sizeof(string)-1;string[i];i--){
    cout<<string[i];
}

cout<<"\n";

我调试了它,'string [i]'的值为0.所以我的问题是,

  1. 为什么使用数组索引而不是布尔值(可以吗?)。
  2. 为什么我的第二段代码不起作用。
  3. 提前致谢。

3 个答案:

答案 0 :(得分:6)

布尔测试string[i]实际上只是检查是否遇到空字符('\0')。 C中的所有字符串都以空字符结尾,因此这适用于通过字符串的前向迭代。但如果你逆转而不是。您应该检查i是否大于或等于零。

此外,sizeof(string)返回数据类型的大小(50个字节,或者更多),而不是它包含的字符串的长度。要获取字符串长度,请使用strlen

for( int i = strlen(string) - 1; i >= 0; i-- ) {
    cout << string[i];
}

我建议不要调用你的变量string,因为这是标准库中的数据类型,如果你将它用作变量名,它会让C ++程序员感到困惑。特别是人们通常导入整个std命名空间并将字符串类引用为string

这就像调用所有数值“整数”一样。这样做实际上并不能告诉程序员它的用途,只是它的类型。请使用更具描述性的变量名称=)

答案 1 :(得分:1)

在上面的for循环中,使用了char而不是bool作为第二个参数。在这种情况下,非零值被视为“真”,零值被视为“假”。

在第二个代码中,for循环不执行,因为string [sizeof(string)-1]为零,并且它被评估为“false”。

如果您按以下方式使用,您的代码将正常工作

for(int i=0;string[i];i++){

答案 2 :(得分:1)

因为这是C ++而不是C,所以最好不要使用内置字符串类而不是使用字符数组。

这是一种逐字符打印字符串反转的方法:

 #include <iterator>
 ...
 typedef std::reverse_iterator<std::string::iterator> rev_iter;

 string str("This is a freaking test!");
 for(rev_iter it (str.end()); it != rev_iter(str.begin()); ++it)
     std::cout <<  *it;
 std::cout << endl;

另一个(但这会修改​​字符串):

#include <algorithm>
...
string str("This is a freaking test!");
reverse(str.begin(), str.end());
cout << str << endl;