这个小程序我做错了什么。
我刚刚开始学习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;
}
答案 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
循环中,您会增加for
(j
)但不会触及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