我正在开发一个C程序,我希望用户在stdin中输入以下格式:
<integer1> <string> <optional-integer2>
当integer2始终存在时,我的程序正常工作。例如“3只鸟2”将运行良好。但是我尝试的每一种方式只会导致编程挂起,如果它收到没有可选部分的输入,比如“5只猫”。如何检查程序是否存在可选整数,如果不存在则跳过读取?
以下是我的工作内容:
int main(){
//help();
size_t size = 20;
ssize_t len;
long num1 = 1111;
long num2 = 2222;
char *word;
char chunks[3][20];
printf("(enter command): ");
char delimeter;
char *cp;
int i;
while(1){
cp = chunks[0];
delimeter = ' ';
for(i = 0; i < 3; i++){
if(i == 2)
delimeter = '\n';
cp = chunks[i];
len = getdelim(&cp, &size, delimeter, stdin);
*(cp+(len - 1)) = '\0';
printf("cp: '%s'\n", cp);
}
for (i = 0; i < 3; i++){
printf("chunks[%d]: '%s'\n", i, chunks[i]);
}
答案 0 :(得分:4)
不是尝试从stdin读取3次,而是读取整行输入一次,然后检查您所拥有的字符串是否包含2或3个有效字段。这样,如果输入只有2个部分,你的读取功能就不会阻塞。
答案 1 :(得分:1)
#include <stdio.h>
#include <ctype.h>
int mygetdelim(void* buff, size_t len, size_t size, FILE* fp){
//char buff[size][len]
//delimiter:' ', '\t', '\n'
char (*buf)[len] = buff;
int i=0, count=0, ch;
while(EOF!=(ch=fgetc(fp))){
if(isspace(ch)){
if(i==0)continue;//skip space chars
buf[count++][i]='\0';
if(count==size || '\n' == ch)break;
i=0;
} else {
buf[count][i++] = ch;
if(i == len - 1){
buf[count++][i]='\0';
if(count==size)break;
i=0;
while(EOF!=(ch=fgetc(fp)) && !isspace(ch));//drop over field character
}
}
}
while('\n'!= ch && EOF!=ch)ch=fgetc(fp);//drop to newline
return count;
}
int main(){
size_t size = 20;
size_t len;
char chunks[3][20];
printf("(enter command): ");
int i;
len = mygetdelim(chunks, 20, 3, stdin);//len is count of data
for (i = 0; i < len; ++i){
printf("chunks[%d]: '%s'\n", i, chunks[i]);
}
return 0;
}
#if 0
(enter command): 3 bird 2
chunks[0]: '3'
chunks[1]: 'bird'
chunks[2]: '2'
(enter command): 5 cats
chunks[0]: '5'
chunks[1]: 'cats'
#endif