尝试颠倒字符输入的顺序。我变得非常接近,但没有雪茄。
#include <iostream>
using namespace std;
const int MAX = 10;
int main()
{
char a[MAX], next;
int index = 0;
cout << "Please enter in up to 10 letters ending with a period: " << endl;
cin >> next;
while((next != '.') && (index < 10))
{
a[index] = next;
index++;
cin >> next;
//cout << " " << next << endl;
}
int numbers_used = index;
for(index = 0; index <= numbers_used; index++)
{
a[index] = a[numbers_used -1];
numbers_used--;
cout << a[index] << " " << endl;
}
}
除了最后一个开关,我得到了所有东西,即使我的代码不是那么干净,我也没能看到我出错的地方。
图书代码是:
for(index = numbers_used -1; index >= 0; index--)
cout<<a[index];
cout<< endl;
为什么它是index = numbers_used - 1 ??由于numbers_used被设置为index并且索引初始化为0而不是1,我不想运行循环“numbers_used”次数?我错过了什么?
答案 0 :(得分:2)
试试这个:
char* flip(char* str, int len) {
for(int x=0; x<(len/2); x++) {
swap(str[x], str[len-x-1]);
}
return str;
}
截至目前,在到达字符串中间后,您将覆盖复制到后半部分所需的值。使用类似&#34; FooBarBiz&#34;的字符串,您的代码将在迭代中生成以下内容(我已经将空格放入以尝试使事情变得更清晰):
1: FooBarBiz
2: z ooBarBiz
3: zi oBarBiz
4: ziB BarBiz
5: ziBr arBiz
6: ziBra rBiz
7: ziBrar Biz
...
然而,我发布的代码使用c ++ swap
函数来交换赠送值,这样就没有丢失的值(我们没有做任何覆盖),你赢了需要将整个字符串存储在占位符变量中。这有意义吗?
答案 1 :(得分:0)
如果要反转列表,则必须从最后一个元素开始并减少索引。
答案 2 :(得分:0)
您可以通过至少两种不同的方式来解决这个问题。您可以反转字符串的顺序然后打印,或者您可以保持原始字符串不变,只需反向打印即可。我建议使用后一种方法,在这种情况下,您需要做的就是将上一个for
循环更改为:
for(index = 0; index < numbers_used; index++)
{
cout << a[numbers_used-index-1] << " " << endl;
}
答案 3 :(得分:0)
使用标准库中的iterators可以解决问题。例如,由std :: string,std :: list或std :: vector提供的BidirectionalIterator可以在两个方向上遍历。
使用std :: string解决方案可能是:
#include <iostream>
#include <string>
using namespace std;
int main(int, char**) {
char n = 0;
string a;
while (n != '.' && a.size() < 10) {
cin >> n;
if (n != '.') {
a.push_back(n);
}
}
for (string::reverse_iterator it = a.rbegin(); it != a.rend(); ++it) {
cout << *it << endl;
}
}
答案 4 :(得分:0)
这样会不会更容易?
#include<iostream>
#include<string>
using namespace std;
const int MAX = 5;
int main()
{
char a[MAX], next;
int index = 0;
bool period = false;
cout << "Please enter in up to 10 letters ending with a period: " << endl;
for(int i = 0; i < MAX && !period; i++)
{
cin >> next;
if(next != '.')
{
a[i] = next; // put the value into the array
index++;
}
else
period = true;
}
for(int i = index - 1; i >= 0 ; i--)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
答案 5 :(得分:0)
我将首先说:使用std::string
而不是C风格的字符串 - 它通常不那么混乱和灵活。
尽管如此,让我们继续使用C风格的字符串,因为这就是你尝试这样做的方式,显然也是你的教科书。
我不会评论用户输入的读取方式,因为我不确定它是从教科书中复制过的( yikes !!)还是你自己做过的任何一种方式我发现这是毫无意义和错误的,因为它可能导致一些问题。请注意,给定的图书解决方案仅按相反顺序打印字符,不反转字符数组本身。你显然试图改变它。
您的解决方案是在for循环内部递减numbers_used
变量。这是一个非常糟糕的主意,因为该变量用于for循环的条件语句。这意味着循环将在迭代整个数组之前停止。即使循环正常工作,你仍然不会反转数组,因为一旦这行执行
a[index] = a[numbers_used -1];
a[index]
的原始值被覆盖并被遗忘。
我会尝试编写一个简单的解决方案来为初学者反转字符数组:
#include <iostream>
#include <cstring> //getline, strlen
using namespace std;
const int MAX_LETTERS = 10;
int main() {
char a[MAX_LETTERS + 1]; //since it's zero terminated
cout << "Enter at most " << MAX_LETTERS << "characters (anything over " <<
MAX_LETTERS << " will be truncated):\n";
cin.getline(a, MAX_LETTERS + 1);
int length = strlen(a); //returns length of input
int last_char = length - 1;
//reverse array
for (int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[last_char];
a[last_char] = temp;
last_char--;
}
//print array
for (int i = 0; i < length; i++)
cout << a[i];
return 0;
}
阅读关于C样式字符串的this教程,它会对你有所帮助。
答案 6 :(得分:0)
代码中的最后一个for循环是
int numbers_used = index;
for(index = 0; index <= numbers_used; index++)
{
a[index] = a[numbers_used -1];
numbers_used--;
cout << a[index] << " " << endl;
}
如果我们考虑10个字母abcdefghij并根据你的代码在第一个循环之后numbers_used=10
。在第二个循环中
//In for loop
//index=0
a[index]=a[numbers_used-1]; // a[0]=a[9] => a[0]=j
numbers_used--; //numbers_used=9;
//index=1
a[index]=a[numbers_used-1]; //a[1]=a[8] => a[1]=i
numbers_used--; //numbers_used=8;
//index=2
a[index]=a[numbers_used-1]; //a[2]=a[7] => a[1]=h
numbers_used--; //numbers_used=7;
//index=3
a[index]=a[numbers_used-1]; //a[3]=a[6] => a[1]=g
numbers_used--; //numbers_used=6;
//index=4
a[index]=a[numbers_used-1]; //a[4]=a[5] => a[4]=f
numbers_used--; //numbers_used=5;
//index=5
a[index]=a[numbers_used-1]; //a[5]=a[5] => a[5]=e
numbers_used--; //numbers_used=4;
// index=6 and numbers_used becomes 4 => index <= numbers_used condition is violated
so you will out of for loop.
这就是你无法通过的原因。在第二个代码中,我在书中。
for(index = numbers_used -1; index >= 0; index--)
cout<<a[index];
cout<< endl;
numbers_used值为10,但[9]是数组中的最后一个值,因此索引被赋值给numbers_used-1。这样你就可以从[9]打印到[0]。