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

时间:2015-05-24 09:37:02

标签: c scanf

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

string : INDIA
integer : 2015
ratio %: 20
integer2 : 2016

现在使用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]);
        }
    }
}

编译后我收到的输出是:

string : %s  INDIA
integer : %ld  2015
ratio %: %ld  0
integer2 : %ld xxxxx  // some garbage

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

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

2 个答案:

答案 0 :(得分:7)

您可以使用%%来缓和并匹配%。从scanf手册页:

  

     

匹配文字&#39;%&#39;。也就是说,&#39; %%&#39;在格式中   串           匹配单个输入`%&#39;字符。没有转换,           并且不会发生任务。

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

答案 1 :(得分:0)

只需使用%%替换%%%代表C中的文字%