反转行的程序未打印为标准输出

Program that Reverses Lines isn't printing to Standard Output

本文关键字:打印 标准输出 程序      更新时间:2023-10-16

感谢您的帮助!我真的很感激,这是一位新程序员写的。我试过编译它,它编译得很好,但当我用一些数字(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;
}

您在两个方法中都创建了本地字符串数组,但从未返回/使用其中的数据-您已经在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;
}

您有很多问题。

一个-您的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

以下是我从编译原始示例中得到的内容。

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中分配的,所以不应该在这里分配Liner’纯粹是本地的。当您从函数返回时,它会消失,因此不会有任何数据要输出。我不认为"失败"是你想要测试的,我认为"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",所以不要声明它。正如我们上面看到的,你使用"arrayradin"绝对会引发编译时错误。

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

现在,它编译时没有出错,并且很容易地反转了几行。我还没有测试到1000行,但这取决于你能否证明它有效。

注释

不鼓励使用"使用命名空间"。我知道,课本上经常使用它,在某些情况下它确实让事情变得更简单,但它也很危险。

考虑一下,在您不知道的"something"命名空间的某些部分中,已经声明了"foo"。然而,在你自己的代码中,你有一个类似的东西,叫做"foo",它足够相似,如果你碰巧把它们混淆了,它不会触发编译器错误(这比你想象的更常见)。

如果你在代码中说"using namespace something;",然后未能限定你自己的"foo"版本,那么你最终会使用"something"版本,并产生很难追踪的奇怪结果。

总是使用限定名称比依赖于"使用名称空间"更可靠。