我想知道是否有可能只使用scanf读取字符串的特定部分。
例如,因为我正在阅读文件,所以我使用fscanf
如果我想在名称和数字(其中数字是111-2222)中读取字符串,例如:
Bob Hardy:某种文字:111-2222:某种文字:某种文字
我使用它但不起作用:
(fscanf(read, "%23[^:] %27[^:] %10[^:] %27[^:] %d\n", name,var1, number, var2, var3))
答案 0 :(得分:1)
您的初始格式字符串失败,因为它不使用:
分隔符。
如果你想让scanf()
读取输入的一部分,但你不关心实际读取的是什么,那么你应该使用带有赋值抑制标志的字段描述符(*
) :
char nl;
fscanf(read, "%23[^:]:%*[^:]:%10[^:]%*[^\n]%c", name, number, &nl);
作为奖励,您无需担心已禁用分配的字段的缓冲区溢出。
您不应尝试通过格式中的尾随换行符匹配单个换行符,因为格式中的文字换行符(或空格或制表符)将匹配任何空白行。在这种特殊情况下,它不仅会消耗行终止符,还会占用下一行的任何前导空格。
最后一个字段没有被抑制,即使它几乎总是会收到一个换行符,因为如果你扫描了文件的最后一行并且它不是换行符,你可以从返回值中判断出来。< / p>
答案 1 :(得分:1)
检查fscanf()
返回值。
fscanf(read, "%23[^:] %27[^:] ...
失败,因为在使用%23[^:]
扫描第一个字段后,fscanf()
遇到':'
。由于这与格式的下一部分不匹配,因此' '
中的空格会停止扫描。
如果代码检查了fscanf()
的返回值,肯定是1,那么问题的根源可能是不言而喻的。因此,扫描需要使用':'
,并将其添加到以下格式:"%23[^:]: %27[^:]: ...
最好使用fgets()
使用fscanf()
读取数据和检测正确且格式不正确的数据非常具有挑战性。可以正确完成扫描预期的输入。然而,它很少能够处理一些错误格式化的输入。
相反,简单地读取数据的行,然后解析它。使用'%n'
是检测完整转化的简便方法,因为它可以保存char
扫描计数 - 如果扫描到达那里。
char buffer[200];
if (fgets(buffer, sizeof buffer, read) == NULL) {
return EOF;
}
int n = 0;
sscanf(buffer, " %23[^:]: %27[^:]: %10[^:]: %27[^:]:%d %n",
name, var1, number, var2, &var3, &n);
if (n == 0) {
return FAIL; // scan incomplete
}
if (buffer[n]) {
return FAIL; // Extra data on line
}
// Success!
注意:示例输入以文本结尾,但原始格式使用"%d"
。对OP的意图不清楚。