如何使用fgets获取第二个整数?

时间:2017-08-08 08:20:44

标签: c fgets

我希望使用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。

1 个答案:

答案 0 :(得分:1)

以下代码以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
}