我想用fgets得到第二个和第三个整数
用户输入:1 2 3

int firstint, secondint;
char buffer[12];
fgets(firstInteger, 12, stdin);


firstint = atoi(buffer);
printf("%d is the first integer", firstint);

它的输出是1。
可以用fgets得到2和3吗?
我知道scanf会导致问题,我想使用fgets。

最佳答案

下面的代码从用str分隔的字符串,中提取数字。
它适用于所有非数字分隔符。
功能strtol可能失败,应进行检查。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *str = "1, 2, 3";
    char *p   = str;
    char *q;

    // While we aren't at the end of string.
    while (*p) {
        // Convert string number to long
        long val = strtol(p, &q, 10);
        if (q > p) {
            // We've got number, clamped to LONG_MIN..LONG_MAX
            // You can store them into array here, if you want.
            printf("%ld\n", val);
            p = q;
        } else {
            // Skip character
            p++;
        }
    }
    return 0;
}

输出:
1
2
3

你的用例:
#include <stdio.h>
#include <stdlib.h>

#define BUFFER_SIZE  12
#define NUMBER_COUNT 3

int main(void) {
    long numbers[NUMBER_COUNT];
    int index = 0;
    char buffer[BUFFER_SIZE];

    if (fgets(buffer, BUFFER_SIZE, stdin)) {
        char *p = buffer;
        char *q;
        while (*p) {
            // Convert string number to long
            long val = strtol(p, &q, 10);
            if (q > p) {
                if (index < NUMBER_COUNT) {
                    numbers[index++] = val;
                } else {
                    break;
                }
                p = q;
            } else {
                // Skip character
                p++;
            }
        }

        for (int i = 0; i < index; i++) {
            printf("%ld\n", numbers[i]);
        }
    }
    return 0;
}

另一种可能性是提到scanf
if (scanf("%d %d %d", &var1, &var2, &var3) != 3) {
    // Failed to read 3 int's
}

10-08 16:10