C++ 初学者c++;数组和循环?
正在尝试反转输入字符的顺序。我离得很近,但没有雪茄C++ 初学者c++;数组和循环?,c++,C++,正在尝试反转输入字符的顺序。我离得很近,但没有雪茄 #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
#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;
}
}
#包括
使用名称空间std;
常数int MAX=10;
int main()
{
字符a[MAX],下一个;
int指数=0;
下一步;
而((下一个!=')&&(索引<10))
{
a[索引]=下一个;
索引++;
cin>>下一步;
//cout如果要反转列表,必须从最后一个元素开始并减少索引。尝试以下操作:
char* flip(char* str, int len) {
for(int x=0; x<(len/2); x++) {
swap(str[x], str[len-x-1]);
}
return str;
}
我所发布的代码使用C++ <代码>交换>代码>函数来交换互补的值,这样就没有丢失的值(我们没有做任何重写)。,您不需要将整个字符串存储在占位符变量中。这有意义吗?
您至少可以用两种不同的方法来实现这一点。您可以颠倒字符串的顺序,然后打印,也可以不修改原始字符串,只需反向打印。我建议使用后一种方法,在这种情况下,您只需需要做的是将上次的for
循环更改为:
for(index = 0; index < numbers_used; index++)
{
cout << a[numbers_used-index-1] << " " << endl;
}
for(索引=0;索引 cout这个问题可以通过使用标准库中的来解决。例如,std::string、std::list或std::vector提供的双向运算符可以在两个方向上进行遍历
使用std::字符串,解决方案可以是:
#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;
}
}
#包括
#包括
使用名称空间std;
int main(int,char**){
charn=0;
字符串a;
而(n!='.&&a.size()<10){
cin>>n;
如果(n!='。){
a、 推回(n);
}
}
for(string::reverse_iterator it=a.rbegin();it!=a.rend();+it){
这样不是更容易吗
#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;
}
#包括
#包括
使用名称空间std;
常数int MAX=5;
int main()
{
字符a[MAX],下一个;
int指数=0;
布尔周期=假;
下一步;
如果(下一步!='。)
{
a[i]=next;//将值放入数组中
索引++;
}
其他的
句号=真;
}
对于(int i=index-1;i>=0;i--)
{
cout我首先要说的是:使用std::string
而不是C样式的字符串-它通常不那么凌乱,而且更灵活
尽管如此,还是让我们来看看C风格的字符串,因为这就是你试图做到的,显然你的教科书也是这样
我不会评论用户输入的阅读方式,因为我不确定它是否是从教科书上抄来的(yikes!!)或者是你自己做的,我发现这是毫无意义和错误的,因为它可能会导致一些问题。请注意,给定的图书解决方案只按相反的顺序打印字符,而不反转字符数组本身。显然,你正在尝试反转它
您的解决方案是递减for循环本身内部使用的数值。\u
变量。这是一个非常糟糕的想法,因为该变量用于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;
}
#包括
#包括//getline,strlen
使用名称空间std;
const int MAX_字母=10;
int main(){
char a[MAX_LETTERS+1];//因为它以零结尾
cout代码中的最后一个for循环是
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;
for(索引=使用的数字\u-1;索引>=0;索引--)
难道你的代码不会覆盖字符串的前半部分吗?一旦你到了中间,你就会读取你已经重写过的值。处理一个副本,或者将项交换到一半。交换时你需要一个中间变量。书本代码起作用的原因是他们在读取数组时没有改变数组。实际上你想做的是什么?这是真的如果我在C++的教科书中是代码,那么就修改书。这不是你写C++的方法。string@sp2danny当前位置不更改;只需从最后一个元素打印出来,但这已经是本书建议的解决方案,而不是他想要实现的。当我设置a[index]=a时,我没有从末尾开始[使用的数字-1]是的,但是您的实现太快了;不需要减少“使用的数量”第二个索引应该是len-x-1
,而不是len-x
。很好,现在更改它我相信这将有助于me@atrain如果这是正确的答案,请接受。如果不是,请告诉我为什么不是,以便我可以尝试进一步帮助您。这将在循环的最后一步产生错误。跟进:为什么在for循环的book代码中使用了index=numbers\u-1??如果我输入了bc.index=3或4。它必须是4。周期计入循环/索引总数?您现有的代码从0开始计数,而book代码从0开始计数因此,在这个修改版本中,我们使用了a[numbers\u used-index-1]
,而图书版本只使用了a[index]
。效果是一样的,唯一的区别是书籍代码效率更高,因为它不需要每次迭代都进行减法运算。注意,不需要向量就可以有反向迭代器,只需要一个双向迭代器。事实上,一个列表就足够了。或者你的意思不同了吗?嗯,std::string
可能是最好的选择。我唯一的观点是,正如答案所暗示的那样,它不仅仅局限于std::vector
。好吧,我试图澄清答案,更一般一些。
int numbers_used = index;
for(index = 0; index <= numbers_used; index++)
{
a[index] = a[numbers_used -1];
numbers_used--;
cout << a[index] << " " << endl;
}
//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;