0

我正在开发一个 C 程序,我希望用户在标准输入中输入以下格式:

<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]);
        }
4

2 回答 2

4

与其尝试从标准输入读取 3 次,不如读取整行输入一次,然后检查您拥有的字符串是否包含 2 个或 3 个有效字段。这样,如果输入只有 2 个部分,您的读取功能就不会阻塞。

于 2012-08-26T10:05:17.703 回答
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
于 2012-08-26T12:41:57.160 回答