我想从一行中读取类似“ 24a10b9100”的内容。问题是,如果我在最后使用这些功能之一(fgetsgetchar等),则输入只是一个字符串。但是我想将数字读为数字,将字符读为字符。

最佳答案

您可以使用sscanf%n说明符来前进字符串。 %n说明符将告诉您扫描处理了多少个字符。可以将其添加到offset中以遍历字符串。它还可以用于检测何时应将一个整数拆分为两个整数。
扫描集%79[^0-9\n]将最多扫描79个不是数字或换行符的字符。

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

int main()
{
    char input[80] = {"24a10b9100"};
    char nondigit[80] = {0};
    int digit = 0;
    int thousands = 0;
    int offset = 0;
    int used = 0;
    int length = 0;
    length = strlen ( input);
    while ( offset < length) {
        if ( ( sscanf(input + offset, "%79[^0-9\n]%n", nondigit, &used)) == 1) {//scan for non digit string
            offset += used;//add characters used by scan to offset
            printf ( "not number %s\n", nondigit);
        }
        if ( ( sscanf(input + offset, "%d%n", &digit, &used)) == 1) {
            offset += used;
            if ( used > 3) {//scanned more than three digits, split the integer
                thousands = digit / 1000;
                digit %= 1000;
                printf ( "thousands %d\n", thousands);
                printf ( "number %d\n", digit);
            }
            else {
                printf ( "number %d\n", digit);
            }
        }
    }
    return 0;
}

10-08 02:20