【问题标题】:strstr will not return a true valuestrstr 不会返回真值
【发布时间】:2014-07-19 01:47:15
【问题描述】:

我正在编写 C 编程书籍中的这个示例,strstr 命令应该在值为 true 时触发 printf 命令。它试图在曲目中找到一个字符串并返回它是在哪个曲目中找到的。我已经为此玩了一个多小时,似乎无法找到问题所在。目前,即使应该匹配,它也不会打印任何内容。

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

char tracks[][80] = {
        "Boston",
        "Where the Streets Have No Name",
        "Row Row Row your Boat",
        "Gangsta Paradise",
        "Yoda",
    };


void findTrack(char searchFor[]){
    int i;
    for(i = 0; i < 5; i++){
        if(strstr(tracks[i], searchFor))
            printf("Track %i: '%s'\n", i, tracks[i]);

    }
}

int main(){

    char searchFor[80];
    printf("what is your string?: ");
    fgets(searchFor, 80, stdin);
    printf("searching for: %s", searchFor);
    findTrack(searchFor);

    return 0;
}

【问题讨论】:

  • strstr 不返回真或假。它返回一个指针。
  • printf("searching for: %s", searchFor); 这有效吗?输出是什么?
  • 您需要从searchFor 中删除行尾的换行符('\n')。
  • @chris 你是在争论迂腐的语义还是你只是不知道你在说什么?非空值在 C 中为真;如果在字符串中找到子字符串,strstr 将返回非 NULL,因此返回 true,因此将满足 if 条件。
  • @JimBalter,我知道用法是完全正确的。我的整个论点都是基于当值为真时。 "value" 似乎最适合 strstr 的结果,所以 "true" 不合适,这表明我可能对 strstr 返回的类型缺乏理解。很容易找到如何使用函数并从中错误推断事物的示例。

标签: c strstr string.h


【解决方案1】:

我建议您将输入的搜索字符串打印出来——您可能会发现行尾有一个换行符。您应该在要搜索的字符串中包含换行符,或者将其从输入中删除。

你可以这样做:

char *p = strchr(searchFor, '\n');
if (p!=NULL) *p='\0';

此外,我建议您应该编写“干净”代码

if(strstr(tracks[i], searchFor)!=NULL) {

这清楚地表明您了解strstr 返回一个指针。

【讨论】:

  • 我试过了,但它仍然没有返回任何东西。如果我反转 if 条件,它会像我期望的那样打印所有字符串,但是当比较字符串时它会中断。
  • 尝试将您的行从printf("searching for: %s", searchFor); 更改为printf("searching for: #%s#", searchFor); - 我想您会发现输入中多了一个回车符。
  • 所以它确实换了一个新行,我该如何删除这个换行?
  • 最简洁的方法是使用strchr 查找换行符并在其位置写入'\0'。我会更新答案...
  • 这是 fgets 常见的事情吗?我将其更改为 scanf ,这似乎解决了问题
【解决方案2】:

补充@floris answer...

将指针转换为布尔值的一个巧妙技巧是对指针 (!!pointer) 进行双重否定,如下所示:

if(!!strstr(tracks[i], searchFor))
    printf("Track %i: '%s'\n", i, tracks[i]);

【讨论】:

    【解决方案3】:

    这是因为fgets() 会在输入中添加一个换行符。所以 SerchFor 输入将变为"SearchFor\n"(输入)。 要进行比较,您必须删除换行符。

    代码如下:

    int len = strlen(buffer);
    
    if(buffer[len-1]=='\n')
       buffer[len-1]='\0'; 
    

    您可以在fgets()之后添加此代码。

    【讨论】:

    • 1) fgets() 不添加 '\n'。如果将'\n' 读入缓冲区,它会保留它。 2) 极端情况:buffer[len-1] 在读取的第一个字符是 空字符 时失败 (UB)。
    猜你喜欢
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2023-04-05
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多