在循环中使用scanf将空间分隔的输入读入多个变量

aelbi1ox  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(121)

我是一个C初学者,试图理解scanf的一些细微差别。这似乎真的很微不足道,但我正在努力以“正确的方式”阅读来自stdin的输入。
当终端输入像string1 string3 string3和我点击返回,它工作正常,并在结果中给出3.
但是当给予string1并点击回车键时,我希望程序在result变量中返回1并中断循环,但这并没有发生,程序只是希望我在终端中输入更多的输入。

#include <stdio.h>
#define nameBufferLen 20

int main () {
    int result;
    char name[nameBufferLen];
    char opens[nameBufferLen]; 
    char closes[nameBufferLen];
    
    while(1) {
        result = fscanf(stdin,"%s %s %[^\n]s", name, opens, closes);
        printf("%s|%s|%s|  AND Result len is : %d\n", name, opens, closes, result);
        if (result!=3) {
            break;
        }
    }

    return 0;
}

我很想知道是什么方法和正则表达式使我能够用scanf做到这一点。

tkclm6bt

tkclm6bt1#

下面是@Barmar提到的实现:

#include <stdio.h>
#define nameBufferLen 19
#define str(s) str2(s)
#define str2(s) #s

int main (void) {
    for(;;) {
        char s[3 * (nameBufferLen + 1)];
        if(!fgets(s, sizeof(s), stdin)) {
            printf("err\n");
            return 1;
        }
        char name[nameBufferLen+1] = { 0 };
        char opens[nameBufferLen+1] = { 0 };
        char closes[nameBufferLen+1] = { 0 };
        int result = sscanf(s,
            "%" str(nameBufferLen) "s"
            "%" str(nameBufferLen) "s"
            "%" str(nameBufferLen) "s",
            name, opens, closes
        );
        if(result == 1)
            break;
    }
}

和运行示例:

a b c
a b
a

如果输入的字符串长度超过19,多余的字符串将溢出到下一个变量中。您可以使用每个变量的strlen()来检测这种情况。或者,您可以使用strpbrk()来解析字符串s

相关问题