初学者c ++数组和循环?

时间:2014-07-23 16:50:11

标签: 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 >> 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”次数?我错过了什么?

7 个答案:

答案 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]。