免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4192 | 回复: 10

gets() 与 getchar() 的疑问----(已解决,谢谢!) [复制链接]

论坛徽章:
0
发表于 2005-12-02 23:53 |显示全部楼层
下面这个小程序的作用是输入字符串到文件中,然后读取并将小写转为大写

#include <stdio.h>

main()
{
    int i, flag;
    char str[80], c;
    FILE *fp;

    fp = fopen("text","w+" );
    for (flag = 1; flag; ) {
        printf("\n输入字符串:\n" );
        gets(str);
        fprintf(fp, "%s", str);
        printf("继续?\n" );
        if (((c = getchar()) == "n" ) || (c == 'N'))
            flag = 0;
        getchar(); //请问,就是这个getchar(),起什么作用?
    }
    fseek(fp, 0, 0);
    while (fscanf(fp,"%s",str) != EOF) {
        for (i = 0; str[ i ] != '\0'; i++)
            if ((str[ i ] >= 'a') && (str[ i ] <= 'z'))
                str[ i ] -= 32;
        printf("\n%s\n",str);
    }
    fclose(fp);
}
上面那个getchar()干什么用的(没有还不行,没有的话,for循环的gets函数第二次以及以后就不起作用了)??
不得期解,请教各位

(上面有的地方格式不大对,主要是因为和一些笑脸及论坛定义的字体格式冲突,只能隔开些,望见谅

[ 本帖最后由 怀恋在子夜 于 2005-12-3 10:39 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2005-12-03 00:16 |显示全部楼层
getchar() 使程序停下来等待输入一个字符,如果输入的是 'n' 或 'N' ,就执行 flag=0 ; 否则 flag = 0 ;的语句不会执行,flag 继续等于 1 , 进入下一个 for 循环。

这样的帖子没有给斑竹枪毙掉,你的运气还真好!

[ 本帖最后由 snow888 于 2005-12-3 00:30 编辑 ]

论坛徽章:
0
发表于 2005-12-03 00:30 |显示全部楼层
to snow888:
你说的不对,在语句if (((c = getchar()) == "n" ) || (c == 'N'))中,已经将getchar()的字符给了c,但是下面那个getchar呢?
我说的是没有下面这个getchar, for循环照样好使,就是里面的gets(str)会出现问题,没有第二个getchar, 循环继续,但是不执行gets(str)这步,而是一味的执行
    printf("继续?\n" );
        if (((c = getchar()) == "n" ) || (c == 'N'))
            flag = 0;
其他的什么也没有。

to xwzss:
这里又没有暂停的意思,为什么要这个语句呢,且不要的话,直接关系到gets(str)语句???

[ 本帖最后由 怀恋在子夜 于 2005-12-3 00:32 编辑 ]

论坛徽章:
0
发表于 2005-12-03 00:47 |显示全部楼层

  1. #include <stdio.h>

  2. main ()
  3. {
  4.   int i, flag;
  5.   char str[80], c;
  6.   FILE *fp;

  7.   fp = fopen ("text", "w+" );
  8.   for (flag = 1; flag;)
  9.     {
  10.       printf ("\n输入字符串:\n" );
  11.       gets (str);
  12.       printf("str[0] is %d\n",str[0]);
  13.       fprintf (fp, "%s", str);
  14.       printf ("继续?\n" );
  15.       if (((c = getchar ()) == 'n' ) || (c == 'N'))
  16.             flag = 0;
  17.       if((c=getchar ())=='\n')
  18.           puts("newline");
  19.     }
  20.   fseek (fp, 0, 0);
  21.   while (fscanf (fp, "%s", str) != EOF)
  22.     {
  23.       for (i = 0; str[i] != '\0'; i++)
  24.     if ((str[i ] >= 'a') && (str[i ] <= 'z'))
  25.       str[i ] -= 32;
  26.       printf ("\n%s\n", str);
  27.     }
  28.   fclose (fp);
  29. }
复制代码


试验看看...

论坛徽章:
0
发表于 2005-12-03 00:58 |显示全部楼层
跳过回车
直觉

论坛徽章:
0
发表于 2005-12-03 01:24 |显示全部楼层
原帖由 怀恋在子夜 于 2005-12-3 00:30 发表
to snow888:
你说的不对,在语句if (((c = getchar()) == "n" ) || (c == 'N'))中,已经将getchar()的字符给了c,但是下面那个getchar呢?
我说的是没有下面这个getchar, for循环照样好使,就是里面 ...

这个getchar()是用来接受回车的,前面我给看错了。

论坛徽章:
0
发表于 2005-12-03 09:39 |显示全部楼层
恩,的确是接受回车的,回车给str,直接自动转换成'\0',所以没输出什么也没看见。
谢谢yarco2 ,xwzss 。

论坛徽章:
0
发表于 2005-12-03 09:52 |显示全部楼层
一般都是去除多余的'\n'

论坛徽章:
0
发表于 2005-12-03 10:07 |显示全部楼层
这是因为现在stdin是行缓冲的,所以虽然是读一个字符,但是还会一直等到输入回车符之后才会读入一个字符,然后进入下一个循环后面就会读取缓冲区中剩下的数据。
你输入一个字符+回车时,gets得到的就是\n了。但是这并不排除你的输入出现多个字符的情况。比如你输入abc\n那么依然会有c\n余下留给了gets来读。
    对于这种情况个人又两种解决办法,一种是就用gets。获得一个字符窜,然后用strcmp同'n'或‘N’比较。这样程序会相对健壮。另一种就是使用ncurse库。先inlucde
<curses.h>然后使用getch()获得一个字符,这次是即时返回的,不用再去处理后面的回车之类的了。

论坛徽章:
0
发表于 2005-12-03 10:31 |显示全部楼层
原帖由 gnap 于 2005-12-3 10:07 发表
这是因为现在stdin是行缓冲的,所以虽然是读一个字符,但是还会一直等到输入回车符之后才会读入一个字符,然后进入下一个循环后面就会读取缓冲区中剩下的数据。
你输入一个字符+回车时,gets得到的就是\n了。但是这并不排除你的输入出现多个字符的情况。比如你输入abc\n那么依然会有c\n余下留给了gets来读。
    对于这种情况个人又两种解决办法,一种是就用gets。获得一个字符窜,然后用strcmp同'n'或‘N’比较。这样程序会相对健壮。另一种就是使用ncurse库。先inlucde
<curses.h>然后使用getch()获得一个字符,这次是即时返回的,不用再去处理后面的回车之类的了。


谢谢gnap,这回小弟算是明白了,学到不少。
结帖咯!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP