【问题标题】:how to print a value after a specific string如何在特定字符串之后打印一个值
【发布时间】:2013-01-16 16:18:23
【问题描述】:

我正在尝试读取文件,找到字符串“myprop”,“myprop”之后将是一个“=”符号,然后是一个数字。我需要将那个数字打印为字符串,去掉空格和 cmets。我能够找到“myprop”字符串,然后我相信我应该使用 fscanf,但我遇到了麻烦。

const char *get_filename_property()
{
    const char *filename  = "myfile.properties";
    const char *propkey = "myprop";
    char buffer[100], *buffPtr, lastChar, value[50];
    int line_num=1, i=0;

    FILE *fp;
    fp=fopen("myfile.properties", "r");
    if (fp == NULL)
        perror("Error opening file\n\n");

    while(fgets(buffer, 100, fp) != NULL)
    {
        if((strstr(buffer, propkey)) != NULL)
        {
            printf("Myprop found on line: %d\n", line_num);
            printf("\n%s\n", buffer);
        }
        line_num++;
    }
    if (fp)
        fclose(fp);
}  

int main(int argc, char *argv[])
{
    get_filename_property();
    system("pause");
    return(0);
}    

【问题讨论】:

  • 如果propkey 的某些部分位于第一个加载的缓冲区而其余部分位于第二个加载的缓冲区怎么办?在这种情况下,您在文件中找不到propkey
  • 您是否需要在程序中的任何时候实际使用该值,还是只是将其打印出来?如果您需要做的只是打印它,我不会费心转换它 - 只需找到 = 符号(使用 strstr() 的返回值和 "myprop" 的已知长度来计算从哪里开始扫描)和直接将其后的字符复制到输出,直到您碰到行尾或空格或另一个不属于该值的字符。如果您需要该值而不是sscanf(),请找到该值的开头并使用适当的strto?() 函数进行转换。
  • 除了主 CPU 寄存器中的随机值之外,您可能还需要考虑从 get_filename_property() 返回一些内容。

标签: c string


【解决方案1】:

您可以在文件中找到mypop 字符串的那一刻添加sscanf。在您的 while 循环中添加以下行:

sscanf(buf,"%*[^=]= %[^\n]",value);

"%*[^=]":这意味着 scanf 将= 之前的所有字符都捕获并忽略它

" %[^\n]":这意味着您将在= 之后的所有字符加盖,直到缓冲区字符串的末尾(甚至是空格字符)。只有值字符串开头的空格字符不会加盖

这样添加

while(fgets(buffer, 100, fp) != NULL)
 {
  if((strstr(buffer, propkey)) != NULL)
  {
   printf("Myprop found on line: %d\n", line_num);
   printf("\n%s\n", buffer);
   sscanf(buf,"%*[^=]= %[^\n]",value);
   printf("\nvalue is %s\n", value);
   break;
  }
  line_num++;
 }

【讨论】:

  • 您的示例代码不应该将buffer 传递给sscanf 的调用吗?
  • 太棒了,谢谢。还有一个问题,我怎么能不打印 cmets?如果propkey所在的行说myprop = 1 //value,我怎么能去掉反斜杠和之后的所有内容
  • @user1984300 你所有的值都是整数?
  • @MohamedKALLEL printf("\nvalue is %s\n", value) 的输出是:value is 1 //value.
  • 如果它们是double 则使用sscanf(buf,"%*[^=]= %f",&value); 并且值应定义为双精度:double value; 这样您就可以避免在双精度后捕获任何字符串。并且不要忘记将 printf 也更改为 printf("\nvalue is %f\n", value);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多