感谢您的帮助! 我真的很感激,这来自一位新程序员。 我已经尝试编译它,它编译得很好 - 但是当我用一些数字(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;
}
答案 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'版本,您将最终使用'某些'版本,并且会产生难以追踪的奇怪结果。
始终使用限定名称而不是依赖于“使用命名空间”更加可靠。