如果使用`fscanf()`读取它时,如何处理字符串中的`%`

Ami*_*rma 2 c scanf

假设有一个文件a.txt,其中每个字符串都是键值对<key: value>.但有一个限制是我的密钥也可以包含字符%.例如:如下所示

string : INDIA
integer : 2015
ratio %: 20
integer2 : 2016
Run Code Online (Sandbox Code Playgroud)

现在通过使用fscanf,我想验证文件中存在的字符串的每个值a.txt.

我的示例代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
   char str[8];
   int arr[2];

   FILE * fp;
   int j=0;
   char *out_format[4] = {
       "string :",
       "integer :",
       "ratio %:",
       "integer2 :"
   };

   fp = fopen ("a.txt", "r");

   if (fp == NULL) {
       perror( "fopen failed for input file\n" );
       return -1;
   }

    for (j=0; j < 4; j++) {
        char c[64]={'\0'};
        strcat(c, out_format[j]);

        if (j == 0) {
           strcat(c, " %s ");
           fscanf(fp, c, str);
           printf("%s %s\n", c, str);
        }
        else {
           strcat(c, " %d ");
           fscanf(fp, c, &arr[j-1]);
           printf("%s %d\n",c, arr[j-1]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编译后我收到的输出是:

string : %s  INDIA
integer : %ld  2015
ratio %: %ld  0
integer2 : %ld xxxxx  // some garbage
Run Code Online (Sandbox Code Playgroud)

这是由于%存在于ratio %: 20文件行中而发生的a.txt.

拜托,有人可以在这里建议吗?如何处理这个,以便我可以获得文件中存在的正确值?

Giu*_*Pes 7

你可以使用它%%来缓和和匹配%.从scanf手册页:

%

匹配文字'%'.也就是说,格式字符串中的'%%'匹配单个输入'%'字符.没有进行转换,也不会进行分配.

手册:http://www.manpages.info/linux/scanf.3.html