如何在一行中最多容纳三个整数?

问题描述 投票:0回答:1

我在windows上用c语言工作。

这是我2小时以来一直在努力解决的问题。

我有一个文件作为输入,我知道第一行会有数字。

我也知道这一行不会有空格。

然而,我不知道这些数字将如何分开,我想只得到前3个整数(可能有少于3个整数,在这种情况下,它们应该取0作为值)。

我更喜欢不使用regex.h的方法,只使用fscanf过滤器,但我会依赖任何好的解决方案。

简而言之:

我所知道的:

  • 该行至少有1个整数。
  • 整数将被一些字符分隔
  • 这一行没有空格

我不知道的是:

  • 整数的数量
  • 整数的长度
  • 分隔符(类型& 长度)

我想要的是:

  • 将遇到的前3个整数放在vars(int)中。

我需要确保定界符都是一样的,并且长度为1。

c scanf
1个回答
1
投票

也许像这样。我用了 sscanf 而不是 fscanf 并没有完全实现所有要求,但你可以调整一下思路。

#include <stdio.h>

void parse(char *str)
{
    printf("String = %s\n", str);
    int a, b, c;
    int items = sscanf(str, " %*[^0-9]%d%*[^0-9]%d%*[^0-9]%d", &a, &b, &c);
    printf("%d items converted\n", items);
    if(items >= 1)
        printf("Item 1 = %d\n", a);
    if(items >= 2)
        printf("Item 2 = %d\n", b);
    if(items >= 3)
        printf("Item 3 = %d\n", c);
    printf("\n");
}

int main(void)
{
    parse("abc!&123");
    parse("ywtas123-&=456xyz");
    parse("*':^123v456?987");
    return 0;
}

程序输出。

String = abc!&123
1 items converted
Item 1 = 123

String = ywtas123-&=456xyz
2 items converted
Item 1 = 123
Item 2 = 456

String = *':^123v456?987
3 items converted
Item 1 = 123
Item 2 = 456
Item 3 = 987

2
投票

使用指定器 %*[^-0-9] 匹配,并丢弃任何不符合条件的字符。- 还是一个数字。

int a, b, c;
fscanf(f, "%d%*[^-0-9]%d%*[^-0-9]%d%*[^\n]", &a, &b, &c);

1
投票

非常感谢,我最终选择了 @Weather-vane 的解决方案(他的第一个解决方案),也选择了 @isrnick 的解决方案。

fscanf(input_file, "%s", BUFFER);
printf("test : %s\n", BUFFER); // Just to check
sscanf(BUFFER, "%*[^0-9]%d%*[^0-9]%d%*[^0-9]%d", &var_num, &var_prec, &mode);

它清除了所有由于新行尾部的问题,也避免了循环,目前,我没有任何bug。

© www.soinside.com 2019 - 2024. All rights reserved.