「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
我们中的许多人都知道 scanf 的传统用途。好吧,这里有一些鲜为人知的事实
如何只读取我们需要的一部分输入?例如,考虑一些仅包含字符后跟整数或浮点数的输入流。我们只需要扫描那个整数或浮点数。
即,
输入:“这是值 100”,
输出:读取的值是 100
输入:“这是值 21.2”,
输出:读取的值是 21.2
/* C 程序来演示我们可以忽略 scanf() 中的某些字符串 */ #include <stdio.h> int main() { int a; scanf("This is the value %d", &a); printf("Input value read : a = %d", a); return 0; } // Input : This is the value 100 // Output : Input value read : a = 100 复制代码
现在,假设我们不知道前面的字符是什么,但我们肯定知道最后一个值是一个整数。我们如何将最后一个值扫描为整数?
以下解决方案仅在输入字符串没有空格时才有效。
/* 示例 C 程序来演示 *s 的使用 */ #include<stdio.h> int main() { int a; scanf("%*s %d", &a); printf("Input value read : a=%d",a); return 0; } // Input: "blablabla 25" // Output: Value read : 25 复制代码
说明: scanf 中的 %*s 用于根据需要忽略某些输入。在这种情况下,它会忽略输入直到下一个空格或换行符。同样,如果你写 %*d 它将忽略整数,直到下一个空格或换行符。
乍一看,上述事实似乎不是一个有用的技巧。为了理解它的用法,我们先来看看fscanf()。
fscanf(): 厌倦了从文件中读取的所有笨拙的语法?好吧, fscanf 来救援。
int fscanf(FILE *ptr, const char *format, ...) 复制代码
fscanf 从 FILE 指针 (ptr) 指向的文件中读取,而不是从输入流中读取。
考虑以下文本文件 abc.txt
名称 年龄 城市 美国广播公司 12 海德巴德 bef 25 德里 cce 65 班加罗尔 复制代码
现在,我们只想读取上述文本文件的城市字段,忽略所有其他字段。fscanf 和上面提到的技巧的组合可以轻松做到这一点
/*c 程序演示 fscanf 及其用法*/ #include<stdio.h> int main() { FILE* ptr = fopen("abc.txt","r"); if (ptr==NULL) { printf("no such file."); return 0; } /* 假设 abc.txt 包含以下格式的内容 姓名 年龄 城市 abc 12 海德巴 bef 25 德里 cce 65 班加罗尔 */ char buf[100]; while (fscanf(ptr,"%*s %*s %s ",buf)==1) printf("%s\n", buf); return 0; } 复制代码
输出:
城市 海德巴 德里 班加罗尔