我在windows上用c语言工作。
这是我2小时以来一直在努力解决的问题。
我有一个文件作为输入,我知道第一行会有数字。
我也知道这一行不会有空格。
然而,我不知道这些数字将如何分开,我想只得到前3个整数(可能有少于3个整数,在这种情况下,它们应该取0作为值)。
我更喜欢不使用regex.h的方法,只使用fscanf过滤器,但我会依赖任何好的解决方案。
简而言之:
我所知道的:
我不知道的是:
我想要的是:
我需要确保定界符都是一样的,并且长度为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
使用指定器 %*[^-0-9]
匹配,并丢弃任何不符合条件的字符。-
还是一个数字。
int a, b, c;
fscanf(f, "%d%*[^-0-9]%d%*[^-0-9]%d%*[^\n]", &a, &b, &c);
非常感谢,我最终选择了 @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。