问题遇到的现象和发生背景
想从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')的空循环也没用。