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;