正在跳过c ++ for循环

时间:2013-01-26 00:57:40

标签: c++

这个小程序我做错了什么。

我刚刚开始学习c ++,而且无论如何我都可以接受这个作为一个没有实际意义的问题。我正在阅读Prata c ++入门,它给了我一个代码示例,该示例采用char数组并在for循环中使用strcmp(),它以“?”开头的ASCII代码顺序迭代直到测试char变量== s来自另一个char的设定值。

我想我可以超越这本书,我试图创建一个类似的程序,它接受一个char数组并使用for循环将获取一个测试char数组并迭代数组的每个值,直到两个变量相等。

我将程序简化为仅在for循环中取每个数组的第一个,因为我遇到了一个问题,程序似乎只是跳过for循环并终止。

首先是prata代码片段,然后是我的代码片段。任何反馈(甚至滥用> _<)都会有用。

#include <iostream>
#include <cstring>

int main() {
using namespace std;
char word[5] = "?ate";

for (char ch = ‘a’; strcmp(word, "mate"); ch++) {
cout << word << endl;
word[0] = ch;
}

cout << "After loop ends, word is " << word << endl;
return 0;
}

我的代码(虽然可能做得不好,我可以接受)

#include <iostream>
#include <cstring>

int main() {
    using namespace std;
    char word[5] = "word";
    char test[5] = "????";
    int j = 0;
    int i = 0;

    cout << "word is " << word << "\nTest is " << test << endl;
    cout << word[0] << " " << test[0] << endl;
    for (char temp = '?'; word[0] == test[0] || temp == 'z'; temp++) {
        if ((word[i]) == (test[j])) {
            test[j] = temp;
            j++;
            temp = '?';
        }
        test[j] = temp++;
        cout << test << endl; //Added to see if the for loop runs through once, 
                                  //which is does not
    }
    return 0;
}

1 个答案:

答案 0 :(得分:4)

您的for循环永远不会启动,因为您的情况如下所示:

word[0] == test[0] || temp == 'z'

总是在第一次传递时返回false。由于temp已初始化为'?'word[0]w)不等于test[0]?),因此您的循环将永远无法启动。< / p>

此外,您已将temp初始化为?因此looking at an ascii chart,您会发现?与更低版本之间存在大量非字母字符情况1}}。

此外,在z循环中,您会增加forj)但不会触及j++。由于您正在以i的{​​{1}}作为索引阅读char,因此word最终会成为i

你似乎让自己感到困惑......

让我们分解你要做的事情:

如果你正在迭代字符串中的每个字符,然后检查该索引处字母表的每个字母,那么你将有两个循环:

test

第一个(迭代遍历字符串中的每个索引应该在索引到达字符串结尾时结束(字符串文字以"wwww"终止):

for(;;) {
    for(;;) {
    }
}

第二个将在'\0'for(int i = 0; word[i] != '\0' && test[i] != '\0'; i++) { for(;;) { } } char temp = 'a')中针对您指定的索引检查字母表中的每个字母(temp++word)。如果它们不相同,则会将test的字符word[i] != test[i];设置为test,直到找到正确的字母为止。总而言之,你最终得到了这个:

i

当然,如果你只是为了获得结果而不是试图自学循环和编程基础知识,那么这只是一种非常简单的simplay调用方式:

temp