反转行的程序未打印为标准输出
Program that Reverses Lines isn't printing to Standard Output
感谢您的帮助!我真的很感激,这是一位新程序员写的。我试过编译它,它编译得很好,但当我用一些数字(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"版本,并产生很难追踪的奇怪结果。
总是使用限定名称比依赖于"使用名称空间"更可靠。
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用提升过程获取 shell 命令的标准输出
- 打印标准::<char>不带无关字符的矢量
- 将标准输出重定向到ostream
- 如何在C++中执行命令并获取命令的返回代码标准输出和标准
- 在程序执行期间从标准输出重定向到自定义流
- 标准输出C++意外行为
- 有没有办法知道C++中将打印到标准输出的大小?
- 在标准输出中执行打印会导致数组中随机分配值
- 反转行的程序未打印为标准输出
- 在C++中打印到标准输出时 /* 注释的行为
- 在 c/c++ 中编辑从 stdin 打印在标准输出上的文本
- 通过C++从标准输出中的一些打印数据中提取特定值
- EXECLP系统调用不打印到标准输出
- (可选)在运行时打印到标准输出
- 如何在Linux (GCC)中打印输出(而不是标准输出)
- Linux打印文档到标准输出或文件
- 是否有一种方法可以查看哪个线程正在使用gdb打印标准输出或标准错误?
- 以编程方式从父进程的子进程捕获打印,因此它们不会转到标准输出
- 将字符串变量的值与一些文本链接,并将其打印到C++中的标准输出