![](/img/trans.png)
[英]How to use fscanf and fgets from a text file with ints and strings?
[英]Can I use fscanf to get only digits from text that contain chars and ints?
我想从包含字符和数字的文件中提取数字。
例如:
+ 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
,它将获得它找到的第一位数,但我错了。 如果有的话,我愿意采取更好的方法。
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()
将数字转换为数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.