dou_uod 2022-03-20 18:20 采纳率: 66.7%
浏览 80

使用while((c=getchar())!='\n')时,陷入死循环。

问题遇到的现象和发生背景

想从stdin中读取信息,第一次读取可以成功,之后就陷入死循环。

问题相关代码,请勿粘贴截图
while(1){
        train_t train;    //自定义的小火车结构
        int count = 1;
        char buf[1024]={0};
        int i = 0;
        printf("Please input your order: ");
    char c;
    while((c = getchar()) != '\n'&&i<1024){     // 1024后面加的,不加是buf溢出导致段错误,加了就是死循环。
        printf("c=%c,zhelima?\n", c);
        printf("i=%d\n",i);
        buf[i++]=c;
    }
    if(strlen(buf)>0){      //这些代码就无关了
        bzero(&train, sizeof(train_t));
        tok_t *tok = calloc(1,sizeof(tok_t));
        int ret = analysis(buf,tok,i);//分析指令,将分析结果赋值给tok_t结构体对应属性
        printf("ret = %d\n",ret);//查看分析是否成功,用于bug调试
        train.dataLength = sizeof(tok_t);
        if(ret == 1){//返回值为1说明分析成功,进行下一步操作
            for(int i=0;i<tok->argc;i++){
                printf("argv[%d] = %s\n",i,tok->argv[i]);
            }
            printf("type = %d\n",tok->type);
            memcpy(train.buf, tok, train.dataLength);
            send(clientFd, &train, sizeof(train.dataLength) + train.dataLength, MSG_NOSIGNAL);
            //2.ls 用于获取当前文件夹下所有文件
            //2.ls test1 用于获取当前文件夹中test1文件夹里的所有文件
            if(tok->type == 2){
                recvFile(clientFd, tok);
                sleep(5);
            }
            //3.puts file1 上传文件
            if(tok->type == 3){
                putsFileClient(tok, clientFd);
            }
            //4.gets file1 下载文件,断点下载
            if(tok->type == 4){
                recvFile(clientFd, tok);
            }
            //5.remove
            //6.pwd
            if(tok->type == 6){
                recvFile(clientFd, tok);
                sleep(5);
            }
            //7.mkdir
            //8.rmdir
        }
    }
    }

运行结果及报错内容

c=�,zhelima?
i=1015
c=�,zhelima?
i=1016
c=�,zhelima?
i=1017
c=�,zhelima?
i=1018
c=�,zhelima?
i=1019
c=�,zhelima?
i=1020
c=�,zhelima?
i=1021
c=�,zhelima?
i=1022
c=�,zhelima?
i=1023
analysis
ret = -1
Please input your order: c=�,zhelima?
i=0
c=�,zhelima?
i=1
c=�,zhe^C

我的解答思路和尝试过的方法

试过每次循环给c赋初值0,但没用,应该是getchar()不知道从哪读了些东西。还试过给文件末尾加了一个while((c=getchar())!=‘\n')的空循环也没用。

我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 九月de️云 2022-03-20 18:50
    关注

    输入那一段看上去没问题,你应该是输入了一个字符后就按回车了吧,试试下面的
    Please input your order:123456789[回车]
    只有你输入回车后,getchar才从stdin读入字符,每次一个直到回车

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月20日

悬赏问题

  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!
  • ¥15 这个如何解决详细步骤