反转线的程序不打印到标准输出

时间:2014-02-10 03:50:51

标签: c++

感谢您的帮助! 我真的很感激,这来自一位新程序员。 我已经尝试编译它,它编译得很好 - 但是当我用一些数字(1,2,3,4,5,6,7,8,9)测试它以确保它正常工作时没有打印到stdoutput。该程序应该从标准输入读取多达1000行并反转它们并将它们发送到标准输出。只是为了反转线条,而不是每行中的每个字母。再次感谢。

#include <iostream>
using namespace std;
const int N = 999;

int arrayreadin(string line[]){
    int x=0;
    string liner[N];
    while(!cin.fail() && x<=N){
        getline(cin,liner[x]);
        x++;
    }
    return x;
}

void output(string line[], int i){
    int x;
    string liner[N];
    while (x>=0){
        cout << liner[x] << endl;
        x--;
    }
    return;
}
int main(){
    int i, x;
    string line[N];
    arrayreadin(line, x);
    output(line, x);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

你有很多问题。

一个 - 你的arrayreadin函数没有返回有用的值 - 你将输入中的值放入一个只存在于函数范围内的数组liner - 所以你返回的只是值x(读取的行数)。你永远不会返回读入的字符串。

两个 - 你循环到cin.fail()。由于您正在阅读一个字符串,我在您阅读完整的1000行之前,您不会失败。在你这样做之前,你仍然处于循环阅读输入中。考虑这是否属实......

三 - 在output函数中,您不会将x初始化为任何内容。因此,不知道它的开头是什么,或者它将执行多少次迭代。添加一行

x = i - 1;  // <<< note x = i - 1, not x = i as I wrote initially
在打印的循环之前

四 - 您使用与您定义的参数数量不同的arrayreadin调用 - 将调用更改为

x = arrayreadin(line);

五 - 你超越你的循环:

string liner[N];
while(!cin.fail() && x<=N){

您只分配N元素,但会继续N+1个循环...将条件更改为

while(!cin.fail() && x<N){

最后,如果您希望能够在输入空字符串时返回(而不是必须始终输入1000个字符串),则需要测试空字符串(而不是cin.fail())。您可以通过在x++;语句之前添加以下行来执行此操作:

    if (0 == line[x].length()) break;

当你做所有这些事情时,你最终得到以下程序 - 这是有效的,如果你输入一个空行(只是一个回车),它将“提前”终止:

#include <iostream>
using namespace std;
const int N = 1000;

int arrayreadin(string line[]){
    int x=0;
    while(!cin.fail() && x<N){
        getline(cin,line[x]);
        if (0 == line[x].length()) break;
        x++;
    }
    return x;
}

void output(string line[], int i){
    int x;
    x = i-1;
    while (x>=0){
        cout << line[x] << endl;
        x--;
    }
    return;
}

int main(){
    int i, x;
    string line[N];
    x = arrayreadin(line);
    output(line, x);
    return 0;
}

测试输出:

Hello
beautiful
world

world
beautiful
Hello

答案 1 :(得分:1)

您正在两种方法中创建本地字符串数组,但从不返回/使用这些数据 - 您已经在main中使用了一个数组 - 使用它。另请注意,x从arrayreadin返回 - 它不是参数:

int arrayreadin(string line[]){
    int x=0;
    while(!cin.fail() && x<N){ // Array is 0..N-1
        getline(cin,line[x]);
        x++;
    }
    return x;
}

void output(string line[], int x){
    int z= x-1; // Again N-1 to 0
    while (z >= 0){
        cout << line[z] << endl;
        z--;
    }
    return;
}
int main(){
    int i, x;
    string line[N];
    x = arrayreadin(line); // #lines returned
    output(line, x); // passed into output
    return 0;
}

答案 2 :(得分:0)

这是我从编译原始示例中得到的结果。

g++     junk2.cpp   -o junk2
junk2.cpp: In function ‘int main()’:
junk2.cpp:27:24: error: too many arguments to function ‘int arrayreadin(std::string*)’
     arrayreadin(line, x);
                        ^
junk2.cpp:5:5: note: declared here
 int arrayreadin(string line[]){
     ^

所以它无法编译为给定。

#include <iostream>
using namespace std;

N不能是999,因为你使用它的方式,你的阵列中最终只有999行。您需要制作N 1000,或在多个位置添加一个。我会假设它已被改为1000。

const int N = 1000;

'line'正在main中分配,所以你不应该在这里分配它。 '班轮'纯粹是本地的。当您从函数返回时,它会消失,因此不会输出任何数据。我不认为'失败'是你想要测试的,我认为'eof'是你想要测试的,而N现在是1000,条件必须改变。

int arrayreadin(string line[]){
    int x=0;
    while(!cin.eof() && x<N){
        getline(cin,line[x]);
        x++;
    }
    return x;
}

同样,'line'在main中分配,所以你不想在这里分配它,'liner'纯粹是本地的,所以它无论如何都不会有任何数据。此外,您将整数输入参数命名为“i”而不是“x”,但在其余代码中使用了“x”。这是代码无法输出任何内容的另一个原因,或者如果确实如此,它可能是内存垃圾导致各种有趣的问题。

void output(string line[], int x){
    int x;
    while (x>=0){
        cout << line[x] << endl;
        x--;
    }
    return;
}

你没有使用'i',所以不要声明它。正如我们在上面看到的那样,使用'arrayreadin'绝对会触发编译时错误。

int main(){
    int x;
    string line[N];
    x = arrayreadin(line);
    output(line, x);
    return 0;
}

现在,它编译时没有错误,并且很容易扭转几行。我没有一直测试到1000行,但这取决于你证明它有效。

不鼓励使用“使用命名空间”。我知道,教科书经常使用它,它确实在某些情况下使事情更简单,但它也很危险。

考虑到这一点,在你不知道的“某事物”命名空间的某些部分,'foo'已被宣布。然而在你自己的代码中,你有一个类似的东西叫做'foo',这个就足够了,如果碰巧混淆了它就不会触发编译器错误(它比你想象的更常见)。

如果你说“使用命名空间的东西;”在您的代码中,然后无法限定您自己的'foo'版本,您将最终使用'某些'版本,并且会产生难以追踪的奇怪结果。

始终使用限定名称而不是依赖于“使用命名空间”更加可靠。