注册 登录
编程论坛 C++教室

有什么办法可以让这样一个程序在遇到一个回车以后自动结束读取?

icedge 发布于 2007-05-23 22:11, 2520 次点击
#include<iostream>
#include<conio.h>
#include<vector>
using namespace std;
char main(){
char a[5][8];
for(int i=0;i<=4;i++){
for(int j=0;j<=7;j++)
a[i][j]=getchar();
}
for(int i=0;i<=4;i++){
for(int j=0;j<=7;j++)
cout<<a[i][j];
cout<<endl;
}
system("pause");
}
这个程序在输入文本时必须输满40个字符才能输出结果,有什么办法可以让它在遇到一个回车就自动输出结果?
或者最好是能让数组本身的大小就可以随着输入内容而改变。因为如果只是让程序在遇到回车后停止读入数据,数组中其他没有负值的元素应该是自动被负了0值吧?最终也会影响输出结果。不过我觉得数组元素的个数是没办法任意由输入的数据个数来改变的,是否可以用向量来实现呢?
11 回复
#2
I喜欢c2007-05-23 22:15
while((a[i][j]=getchar())!=13)
#3
icedge2007-05-23 22:51
这样改的效果是不是一样的?但是运行结果还是和不加那个条件一样的。while循环不太会用。
#include<iostream>
#include<conio.h>
#include<vector>
using namespace std;
char main(){int i,j;
char a[5][8];
for( i=0;i<=4;i++){
for( j=0;j<=7&&a[i][j]!=13;j++)//////////////////
a[i][j]=getchar();
}
for( i=0;i<=4;i++){
for( j=0;j<=7;j++)
cout<<a[i][j];
cout<<endl;
}
system("pause");
}
#4
aipb20072007-05-24 09:02
楼主想法可能不对哦,如果你要输入到一个2维数组或向量的话,你就应该要确定它的维数啊!

可以用回车结束输入,但是你想它的大小随着你输入的字符多少变化,怎么行呢?如果是一维的话,就没问题!
#5
BJSH2007-05-24 09:19

# include "stdafx.h"
# include <iostream>
using namespace std;
int main(){
char a[5][8];
int i, j;
for( i=0;i<=4;i++)
{
for( j=0;j<=7;j++)
if ( (a[i][j]=getchar()) == '\n' )
break;
if ( j <= 7 )
break;

}
a[i][j]='\0';
for( i=0;i<=4;i++)
{
for( j=0;j<=7;j++)
if ( a[i][j] != '\0' )
cout<<a[i][j];
else
break;
if ( j <= 7 )
break;

}

return 0;
}


遇到第一个回车自动结束;
数组中其他没有赋值的元素并不是自动赋值为0;而是垃圾值;
上面这段代码屏蔽了那些垃圾值;

最好是能让数组本身的大小就可以随着输入内容而改变;
这最好使用指针;


[此贴子已经被作者于2007-5-24 9:22:55编辑过]

#6
icedge2007-05-24 11:34
如果把这段程序作成一个密码的录入和核对的程序,是不是就会有一个密码位数的上限?这也就是现在的所有网络和软件帐户密码都有位数上限的原因?也就是说在定义一个录入键盘输入字符的数组时还是必须先给一个极限容量的,这样在输入数据大小小于这个容量时,其他没有被负值的元素就只能在输出时用别的方法过滤掉。
另外,如果是一维数组或向量又怎么让容器随着实际数据的大小来改变容量呢?
#7
aipb20072007-05-24 12:04
以下是引用icedge在2007-5-24 11:34:46的发言:
如果把这段程序作成一个密码的录入和核对的程序,是不是就会有一个密码位数的上限?这也就是现在的所有网络和软件帐户密码都有位数上限的原因?也就是说在定义一个录入键盘输入字符的数组时还是必须先给一个极限容量的,这样在输入数据大小小于这个容量时,其他没有被负值的元素就只能在输出时用别的方法过滤掉。

这个就不很清楚了,关系到网络和软件的密码帐户,我想最基本的思想也许是你说这样,但是肯定不是这样实现的,估计就太复杂了。你可以用你想的去模拟一个密码程序。

char ch;
vector<char> cvec;
while ((ch = getchar()) != '\n')
cvec.push_back(ch);
for (unsigned int i = 0;i < cvec.size();++i)
cout << cvec[i];

用vector可以这样!

#8
icedge2007-05-24 12:37
谢谢大家帮忙了。
#9
icedge2007-05-24 12:55
还有一个问题,回车和换行在c++中是怎么区分的?回车的ascII是13,但是在这个程序中的限定条件如果是13的话,程序在运行时即便点下回车键也不会自动结束,只能用换行符(10),才会达到预期目的。
#10
aipb20072007-05-24 13:18

[CODE]#include <iostream>
using namespace std;
int main(){
cout<<"difference \r"<< "a"<<endl;
}[/CODE]

你运行下就知道了,\r是回车符,\n是换行符。自己改红色那里!

#11
icedge2007-05-24 13:34
那一般用在键盘点回车键,系统识别的应该都是换行符吧?

顺便为一下,这里怎么引用别人说的话?那一般用在键盘点回车键,系统识别的应该都是换行符吧?

顺便问一下,这里怎么引用别人说的话?直接点引用好像不起作用。
650)this.style.width=650;"> 直接点引用好像不起作用。
650)this.style.width=650;">

[此贴子已经被作者于2007-5-24 13:38:13编辑过]

#12
wfpb2007-05-24 16:55
windows操作系统 ->"按下Enter" : '\r'+'\n'
unix操作系统 ->"按下Enter" : '\n'
1