
这个程序没错,运行结果也是合情合理的,只不过不是你预期的,那是因为你没有理解输入输出流的概念,重点是这个流的含义,以及没有理解某些特殊字符,比如回车和换行。
你这个程序2次循环,每一次循环输入两个字符,然后分别打印2个字符。
但是你忽略了回车,你每一次输入2个字符之后,要按一下回车字符,而scanf读取2个字符,那么按下的回车并没有被读取,直到下一次循环时回车才会被读取。
所以第二个循环的时候,假如你输入了 x y 回车。 那么实际上a和b存入的值是 a = 回车 b = ‘x'。
注解:
键盘输入的任何数据,都按顺序一个一个排好队等待程序读取,这个队就是输入流。你按下了,如果程序没有读取,则数据一直在那里等待。 你输入 “12回车” 输入流的数据如下
’1‘,’2‘, ’\r‘ 。。
所以'\r'会干扰你的下一次循环。scanf 参数如果是 %c 表示一次从输入流取一个字符。
回车和换行都是特殊字符,回车 = ’\r‘ 换行 = '\n'
改一下程序实现你要的效果,如下。
#include<stdioh>
int main()
{
int i;
char a,b,n;
for (i=1;i<=2;i++)
{
scanf("%c%c%c",&a,&b,&n);
printf("a=%c,b=%c,enter=0x%X\n",a,b,n);
}
printf("enter any key to exit !!\n");
getchar();
return 0;
}
你为什么要写成这样呢,getline我觉得不太好用,具体为什么这里会出问题我再仔细看看,但是想你需要输入的格式来看,改成这样就可以了,我试过没有问题:
getline(cin,command);
//seperate transaction type
typeTran=commandsubstr(0);
//seperate transaction amount
tran=atoi(commandsubstr(2)c_str());
直接将这一部分改为cin>>typeTran>>tran;就完全正常
嗯,问题找到了,可能是由于上一个cin,导致键盘缓冲区中留有一个换行符,所以执行下来后会导致getline(cin,command);直接get到一个换行符,那么tran=atoi(commandsubstr(2)c_str());显然就越界了,因为command就是一个换行符,substr的下标越界。那么修正的话在getline之前清空键盘缓冲区就可以了,测试了没有问题。
cout<<endl<<"Enter a transaction : ";//input a transaction
fflush(stdin);//这里清空键盘缓冲区
getline(cin,command);
//seperate transaction type
typeTran=commandsubstr(0,1);//这里注意,得到第一个字符,那么偏移量为0,获取字符数应该为1,所以需要修改,否则typeTran就和command一样了
//seperate transaction amount
tran=atoi(commandsubstr(2)c_str());
嗯嗯,这样就没问题了
中文全角分号要改成英文半角分号。
如下:
#include <stdioh>main()
{
double a,b,area;
a=2,b=3;
area=ab;
printf("area=%f\n",area);
}
另外,为了符合标准C,建议这么写:
#include <stdioh>int main()
{
double a,b,area;
a=2,b=3;
area=ab;
printf("area=%f\n",area);
return 0;
}
以上就是关于c语言简单程序。有什么错误啊。。。 #include<stdio.h> int main() {i全部的内容,包括:c语言简单程序。有什么错误啊。。。 #include<stdio.h> int main() {i、简单c++程序出错。大侠过来看看、c语言初学者按照教材写了一个很简单的程序,为什么会有一个错误求找出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)