用scanf的一个问题,

五号智能 2013-12-12 09:51:19


char sex[3]
while(scanf("%s",sex)!=1) fflush(stdin);

我想对输入的字符数进行检查,如果超过规定的字符就刷新重输入,但我这样做不行.具体怎么做才好呢.
...全文
215 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
五号智能 2013-12-13
  • 打赏
  • 举报
回复
真是太感谢了,这么多人帮助我. 首先,我这个问题是只想在输入时超出缓冲长度的时候让它重新输入.但scanf这个函数无论读入字符数量限定与否,只要输入的类型正确且没有遇EOF,它的返回值都是1.所以想单纯用scanf的返回值来判断是否输入了过多的字符是不可能的了. 最终以最短小代码的4楼,赢的了我崇拜~~
引用 4 楼 angel_su 的回复:
你可以加读一个字符判断,限定是必要的,防止输入太长数组越界操作...

scanf("%2s%c",sex, &c);
while (c != '\n')
{
    fflush(stdin);
    scanf("%2s%c",sex, &c);

}
这代码的想法别出心裁.真是太棒了.判断输入字符后面 的字符是否是换行,如果不是换行,那肯定是多输入了某些东西.代码矮小精悍.完成了最实用的功能.
mujiok2003 2013-12-12
  • 打赏
  • 举报
回复
$ cat test.c && gcc -o demo.exe test.c && ./demo.exe 5
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char** args)
{
      unsigned int n;
      char* buf,ws, format[32];
      if(argc == 2)
      {
         if(sscanf(args[1], "%i", &n) != 1 || 0 == n)
            return -1;

         buf = (char*) malloc(n+1);
         sprintf(format, "%%%is%%c", n);
         if(buf)
         {
           do
           {
             if(scanf(format, buf, &ws) == 2)
             {
                if(strlen(buf) == n && ws == '\n')
                {
                  break;
                }
             }

             fflush(stdin);
           }while(1);
           printf("you finally get: %s", buf);
           free(buf);
         }
      }
      return 0;
}
//123
//1234
//123456
//12345
//you finally get: 12345
赵4老师 2013-12-12
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
赵4老师 2013-12-12
  • 打赏
  • 举报
回复
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
angel_su 2013-12-12
  • 打赏
  • 举报
回复
你可以加读一个字符判断,限定是必要的,防止输入太长数组越界操作... scanf("%2s%c",sex, &c); while (c != '\n') { fflush(stdin); scanf("%2s%c",sex, &c); }
lin5161678 2013-12-12
  • 打赏
  • 举报
回复
不好使是你没说清楚你想干嘛 什么是你所谓的规定字符
五号智能 2013-12-12
  • 打赏
  • 举报
回复
1、用scanf("%2s",sex)直接限定; 这办法没好使,

                char sex[3]
                printf("性别:");
		while(scanf("%2s",sex)!=1)  fflush(stdin);
图灵狗 2013-12-12
  • 打赏
  • 举报
回复
1、用scanf("%2s",sex)直接限定; 2、最好是用getch/getchar一个字符一个字符的判断。
引用 楼主 xgywd 的回复:

    char sex[3]
    while(scanf("%s",sex)!=1)  fflush(stdin);
我想对输入的字符数进行检查,如果超过规定的字符就刷新重输入,但我这样做不行.具体怎么做才好呢.

70,022

社区成员

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

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