我是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.所以我的问题是,
提前致谢。
答案 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;