我想从包含字符和数字的文件中提取数字。
例如:
+ 321 chris polanco 23
我想跳过'+'并只获得321.
这是我到目前为止的代码。
while(fscanf(update, "%d", ¤tIn->userid) != EOF){
currentIn->index = index;
rootIn = sort(rootIn, currentIn);
index = index + 1;
currentIn = malloc(sizeof(Index));
}
我在想,因为我有%d
它会得到它找到的第一个数字,但我错了。如果你们有任何人,我愿意接受更好的方法。
答案 0 :(得分:2)
我建议使用fgets() + sscanf()组合来处理每一行,而不是与fscanf()挣扎(并在以后遇到格式问题)。
如果您知道您感兴趣的整数从文件的每一行的第3个位置开始,那么您可以在sscanf()中执行line+2
来读取它。否则,您可以根据输入文件的格式修改sscanf()格式字符串。
char line[MAX_LINE_LEN + 1];
While ( fgets(line, sizeof line, update) )
{
if(sscanf(line+2, "%d", ¤tIn->userid) != 1)
{
/* handle failure */
}
...
}
答案 1 :(得分:0)
while (fscanf(update, "%*[^0-9]%d", ¤tIn->userid) == 1)
{
...
}
这会跳过非数字(即%*[^0-9]
部分)后跟一个整数。抑制的分配不计算在内,因此== 1
可确保您获得一个号码。
不幸的是,如果文件中的第一个字符是数字,则会遇到问题 - 正如Chris Dodd所指出的那样。有多种可能的解决方案:
ungetc('a', update);
将首先读取非数字。while ((fscanf(update, "%*[^0-9]"), fscanf(update, "%d", ¤tIn->userid)) == 1)
或者:
while (fscanf(update, "%*[^0-9]%d", ¤tIn->userid) == 1 ||
fscanf(update, "%d", ¤tIn->userid) == 1)
{
...
}
根据您认为更有可能的情况,您可以撤消这两个fscanf()
政策的顺序。使用scanf()
函数族,如果数字字符串太长以至于数字无法在int
中表示,则总会出现问题。你得到未定义的行为。我不打算解决这个问题。
这将为每行拾取多个数字,每次调用一个。如果您希望每行有一个数字,或者想要控制每行的处理方式,请使用fgets()
或readline()
来读取该行,然后使用sscanf()
进行分析。这样做的一个优点是,如果您这样选择,您可以使用strtol()
之类的细致函数将数字转换为数字。