为什么输入后一个字符后就直接结束程序?我已经清除缓冲区了啊?

luckyyulin 2010-12-16 02:42:55
//从键盘输入若干行字符(每行长度不等),输入后把它们存储到一次盘文件中。再从该文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输入
问题:1.什么输入后一个字符后就直接结束程序?我已经清除缓冲区了啊
2.从文件中读取%s,以回车作为判断字符串是否结束,然后读取对吗?

#include <stdio.h>
int main()
{
int i,flag;
char str[80],c;
FILE *fp;
fp=fopen("text","w");
flag=1;
while(flag==1)
{
printf("input \n");
gets(str);
fprintf(fp,"%s",str);
printf("continue?:");
fflush(stdin); //清除缓冲区
scanf("%c",&c); //1.为什么输入后一个字符后就直接结束程序?我已经清除缓冲区了啊
if((c='N')||(c='n'))
flag=0;
getchar();
}
fclose(fp);
fp=fopen("text","r");
while(fscanf(fp,"%s",str)!=EOF) //2.从文件中读取%s,以回车作为判断字符串是否结束,然后读取对吗?
{
for(i=0;str[i]!='\0';i++)
{
if((str[i]<='z')&&(str[i]>='a'))
str[i]-=32;
printf("%s\n",str);
}
}
return 0;
}

...全文
293 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Huppert 2010-12-17
  • 打赏
  • 举报
回复
关于问题3, 我觉得应该把第一个while循环中的 fprintf(fp,"%s",str);
改为 fprintf(fp,"%s\n",str);
while(flag==1) 
{
printf( "input \n ");
gets(str);
fprintf(fp, "%s\n",str);
yiruirui0507 2010-12-16
  • 打赏
  • 举报
回复
if((c='N')||(c='n'))
改为
if((c=='N')||(c=='n'))
浮一大白开水 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 prohibit 的回复:]

C/C++ code
if((c='N')||(c='n'))



永远为真啊,写代码时最好反过来写,这样编译的时候就会报错的,避免粗心造成的运行结果错误
C/C++ code
if(('N'==c)||('n'==c))
[/Quote]
+
有时候这会让人想死
yskcg 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luckyyulin 的回复:]

我还想问一个,问题3: 就是为什么从屏幕上输出的字符串没有换行啊,我明明换了的呀?
C/C++ code

#include <stdio.h>
int main()
{
int i,flag;
char str[80],c;
FILE *fp;
fp=fopen("text","w");
flag=1;
while(flag==1)
……
[/Quote]
楼主你是一次性输出str中的内容呀!你的语句的是:把str地址开始的内存中的东西输出到输出设备,结束后,在换行。你可以参考一下printf的linux的实现方式。可以参考这篇文章http://blog.csdn.net/yskcg/archive/2010/12/13/6073951.aspx


如果要实现每个字符输出就换行的话,可以这样:

for(i=0;xxx条件;i++)
printf("c\n",str[i]);
無_1024 2010-12-16
  • 打赏
  • 举报
回复
因为你的文件写入的时候没有换行的标志 所以第二次读取的时候就读取了一整行啊
luckyyulin 2010-12-16
  • 打赏
  • 举报
回复

#include <stdio.h>

int main()
{
xieru();
duqu();
system("pause");
return 0;
}

void xieru()
{
int flag;
char str[80],c;
FILE *fp;
fp=fopen("text.txt","w");
flag=1;
while(flag==1)
{
printf("input \n");
gets(str);
fprintf(fp,"%s",str);

printf("continue?:");
fflush(stdin); //清除缓冲区

scanf("%c",&c); //1.为什么输入后一个字符后就直接结束程序?我已经清除缓冲区了啊
if((c=='N')||(c=='n'))
{
flag=0;
}
getchar();
}
fclose(fp);
}

void duqu()
{
int i;
char str[80];
FILE *fp;
fp=fopen("text.txt","r");
while(fscanf(fp,"%s",str)!=EOF) //2.从文件中读取%s,以回车作为判断字符串是否结束,然后读取对吗?
{
for(i=0;str[i]!='\0';i++)
{
if((str[i]<='z')&&(str[i]>='a'))
{
str[i]-=32;
}
}
printf("%s\n",str); //我这样改了,可还是输出的字符串不能换行啊?怎么回事?

}
}

bobo364 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 whhlpo 的回复:]
怎么看 printf("%s\n",str); 都应该放到for循环外面啊
[/Quote]

要结果就应该你这么写,
但意图是要全部变成大写的这个过程,就要按照楼主这么写
Huppert 2010-12-16
  • 打赏
  • 举报
回复
怎么看 printf("%s\n",str); 都应该放到for循环外面啊
prohibit 2010-12-16
  • 打赏
  • 举报
回复
if((c='N')||(c='n'))



永远为真啊,写代码时最好反过来写,这样编译的时候就会报错的,避免粗心造成的运行结果错误
if(('N'==c)||('n'==c))
bobo364 2010-12-16
  • 打赏
  • 举报
回复
依次把字母大写,输出一次,下一次,把下一个字母大写,上次的大写保留,在输出.....
没有则这个字符原样输出
bobo364 2010-12-16
  • 打赏
  • 举报
回复
很巧妙的一种写法,写入没啥花样,读取中的那个for循环,假如说str中没有字母是小写字母的话,原样输出一次,接着到第二个字母,如果是的话转成大写,这次转换好的输出...
#include <stdio.h>

int main()
{
xieru();
duqu();
system("pause");
return 0;
}

void xieru()
{
int flag;
char str[80],c;
FILE *fp;
fp=fopen("text.txt","w");
flag=1;
while(flag==1)
{
printf("input \n");
gets(str);
fprintf(fp,"%s",str);

printf("continue?:");
fflush(stdin); //清除缓冲区

scanf("%c",&c); //1.为什么输入后一个字符后就直接结束程序?我已经清除缓冲区了啊
if((c=='N')||(c=='n'))
{
flag=0;
}
getchar();
}
fclose(fp);
}

void duqu()
{
int i;
char str[80];
FILE *fp;
fp=fopen("text.txt","r");
while(fscanf(fp,"%s",str)!=EOF) //2.从文件中读取%s,以回车作为判断字符串是否结束,然后读取对吗?
{
for(i=0;str[i]!='\0';i++)
{
if((str[i]<='z')&&(str[i]>='a'))
{
str[i]-=32;
}
printf("%s\n",str);
}
}
}
luckyyulin 2010-12-16
  • 打赏
  • 举报
回复
我还想问一个,问题3: 就是为什么从屏幕上输出的字符串没有换行啊,我明明换了的呀?

#include <stdio.h>
int main()
{
int i,flag;
char str[80],c;
FILE *fp;
fp=fopen("text","w");
flag=1;
while(flag==1)
{
printf("input \n");
gets(str);
fprintf(fp,"%s",str);
printf("continue?:");
fflush(stdin); //清除缓冲区
scanf("%c",&c); //1.为什么输入后一个字符后就直接结束程序?我已经清除缓冲区了啊
if((c='N')||(c='n'))
flag=0;
getchar();
}
fclose(fp);
fp=fopen("text","r");
while(fscanf(fp,"%s",str)!=EOF) //2.从文件中读取%s,以回车作为判断字符串是否结束,然后读取对吗?
{
for(i=0;str[i]!='\0';i++)
{
if((str[i]<='z')&&(str[i]>='a'))
str[i]-=32;
printf("%s\n",str); //3.为什么从屏幕上输出的字符串没有换行啊,我明明换了的呀

}
}
return 0;
}


就想叫yoko 2010-12-16
  • 打赏
  • 举报
回复
+1[Quote=引用 1 楼 try325 的回复:]
if((c='N')||(c='n')) //==
[/Quote]
bdmh 2010-12-16
  • 打赏
  • 举报
回复
if((c='N')||(c='n'))
改为
if((c=='N')||(c=='n'))
try325 2010-12-16
  • 打赏
  • 举报
回复
if((c='N')||(c='n')) //==

70,009

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧