1

我是 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. 为什么我的第二段代码不起作用。

提前致谢。

4

3 回答 3

6

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

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

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

我建议不要调用您的 variables string,因为这是标准库中的一种数据类型,如果您将其用作变量名,C++ 程序员会感到困惑。尤其是当人们很普遍地导入整个std命名空间并将字符串类称为string.

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

于 2013-10-14T04:01:33.730 回答
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;
于 2013-10-14T04:48:44.163 回答
1

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

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

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

for(int i=0;string[i];i++){
于 2013-10-14T04:18:49.690 回答