【问题标题】:C : comparing string to "%.c"?C:将字符串与“%.c”进行比较?
【发布时间】:2020-07-01 23:40:04
【问题描述】:

我正在尝试做一些棘手的事情。 我想打开一个文件,并检查该文件是否包含子字符串:echo %.c。 正是这个子字符串:echo,后跟一个百分号,后跟一个点,然后是字符 c

我只需要找到用于strstr 的正确语法。

我的代码:

FILE *search = fopen(file, "r");
if (!search) {
    errx(2, "File not found.");
    exit(2);
}
char line[8193];
bool check = false;
while (fgets(line, sizeof(line), search)) {
    if (strstr(line, "echo %.c")) {
        ck = true;
    }
}
fclose(search);

这不起作用,因为这是printf 的保留语法。如何更改它才能正常工作?

【问题讨论】:

  • “printf 的保留语法”是什么意思? printf 格式字符串语法在 strstr() 中是无关紧要的——它只接受你给它的字符串,没有格式化/解释。
  • 它将查找字符串“echo %.c”。没有“printf 的保留语法”。
  • 如果这是“近似代码”(例如ck)并且您也从fgets获得了搜索字符串,它可以包含换行符,因此只有出现在末尾才会匹配行的。
  • 确切的错误信息是什么,它来自哪里?同时发布完整的代码。
  • 你应该发布你的确切代码,你用来测试的那个......而不是它的副本......正如答案之一所说:你有一些差异使你的程序不是可执行文件,因此如果您发布的内容不是您测试的内容,您可以消除一些问题。

标签: c arrays string file pointers


【解决方案1】:

printf 与此无关。 "echo %.c" 是传递给strstr 的完美字符串。您的环境一定有问题,导致您无法运行此程序。

但是请注意,如果搜索字符串恰好出现在超过 8192 字节的行中,并与 8192 字节块的边界重叠,则程序可能无法找到它。不太可能,但在不正常的测试台上是可能的。

还要注意ck = true; 是一个错字:变量名是check。这让我想知道实际的违规代码中还存在哪些其他差异。你的意思是搜索"echo *.c"

【讨论】:

    【解决方案2】:

    我检查了百分号工作正常。 检查这个例子:https://onlinegdb.com/ByHR13MI8

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        const char *line = "The interest rate is 3%.";
        const char *percentage;
        printf("%s\n", line);
        percentage = strstr(line, "3%");
        if (percentage)
            printf("%s", percentage);
        else
            printf("not found");
        return 0;
    }
    

    【讨论】:

    • 一个例子不是正式的证明,但确实% 符号完全符合发布的代码。
    • @chqrlieforyellowblockquotes,你是完全正确的。但是测试代码可以作为解决方案是否可行的第一个指示。 (我知道有效的代码并不能保证该代码是普遍有效的。)
    【解决方案3】:

    这是strstr的原型:

    char *strstr(const char *haystack, const char *needle);
    

    这种用法对我来说很好。我不知道你在说什么“printf 的保留语法”,除非它是一些模糊的不正确的编译器警告。 C 标准没有提及此类内容。

    如果您的代码因为ck = true; 而无法编译,请尝试将其更改为使用您的变量名——check = true;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2020-04-15
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      相关资源
      最近更新 更多