C语言中strstr()函数的使用

本文展示了一个使用C语言实现的简单程序,该程序通过字符串搜索功能查找特定兴趣点,如运动爱好者,同时排除不相关的结果,例如提及比伯的条目。此代码片段来自《Head First C》一书。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >





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

int NUM_ADS = 7;
char * ADS[] = {
    "William: SBM GSOH likes sports, TV, dining",
    "Matt: SWM NS likes art, movies, theater",
    "Luis: SLM ND likes books, theater, art",
    "Mike: DWM DS likes trucks, sports and bieber",
    "Peter: SAM likes chess, working out and art",
    "Josh: SJM likes sports, movies and theater",
    "Jed: DBM likes theater, books and dining"
};

void find()
{
    int i;
    puts("Search results:" );
    puts("---------------------------" );

    for(i = 0; i < NUM_ADS; i++) {
        if(strstr (ADS[ i], "sports")
                && ! strstr(ADS [i], "biber" )) {

            printf ("%s\n", ADS[i ]);
        }
    }
    puts("---------------------------" );
}

int main()
{
    find();
}

//代码片段摘自 Head First C, by David Griffiths and Dawn Griffiths. 
//Copyright © 2012 David Griffiths and Dawn Griffiths. 
//All rights reserved. ISBN: 978-1-449-39991-7
//代码可能有修改和删节 


<think>好的,我现在需要帮助用户了解C语言strstr函数的用法。首先,我得回忆一下strstr函数的基本功能和用法。strstr函数用于在字符串中查找子字符串的首次出现位置,返回指向该位置的指针,如果找不到则返回NULL。用户可能想知道如何声明这个函数,参数是什么,以及如何使用它。 接下来,我应该参考用户提供的引用内容。根据引用[1],函数的声明是char *strstr(const char *str1, const char *str2),需要包含头文件string.h。引用[2]中的示例展示了如何使用strstr查找子字符串并用strncpy修改内容,这可以帮助用户理解实际应用。引用[3]提到了函数原型,可能还涉及实现细节。 用户可能需要分步骤的说明,包括函数声明、参数解释、返回值、使用示例和注意事项。比如,参数str1是主字符串,str2是子字符串,返回值是指针,需要注意空指针和字符串结束符的问题。示例部分可以展示查找成功和失败的情况,以及如何操作找到的指针。 另外,用户可能对内存修改的例子感兴趣,比如引用[2]中的strncpy修改内存块内容。这需要解释找到子字符串后如何操作指针,并注意不要越界。同时,需要提醒用户在使用返回的指针前检查是否为NULL,避免程序崩溃。 还要考虑生成相关问题,可能涉及strstr的实现原理、与类似函数的区别(如strchr)、性能分析或者常见错误。比如,如何自己实现strstr函数,或者处理多次查找的情况。 最后,确保回答符合格式要求:行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不需要数学公式。用中文回答,结构清晰,分步骤说明,引用标记正确,示例代码用正确格式,然后生成相关问题。</think>### C语言strstr函数使用说明 #### 一、函数声明 ```c #include <string.h> char *strstr(const char *str1, const char *str2); ``` 函数在`string.h`头文件中定义,用于在字符串`str1`中查找子字符串`str2`的首次出现位置[^1][^3]。 #### 二、参数说明 1. `str1`:被搜索的主字符串(需以`\0`结尾) 2. `str2`:需要查找的子字符串(需以`\0`结尾) #### 三、返回值 - 找到时:返回指向`str1`中首次出现`str2`位置的指针 - 未找到时:返回`NULL` - 当`str2`为空字符串时:返回`str1`的起始地址 #### 四、使用示例 ```c #include <stdio.h> #include <string.h> int main() { char text[] = "Learn C programming with examples"; char *result = strstr(text, "program"); if (result != NULL) { printf("找到位置:%ld\n", result - text); // 输出:找到位置:7 printf("匹配位置后的内容:%s\n", result); // 输出:programming with examples } else { printf("未找到子串\n"); } return 0; } ``` #### 五、内存操作应用 通过`strstr`定位后可直接操作内存(需注意内存边界)[^2]: ```c char str[] = "Original string for modification"; char* pos = strstr(str, "string"); if (pos) { strncpy(pos, "BYTES", 5); // 修改找到的位置内容 printf("%s\n", str); // 输出:Original BYTES for modification } ``` #### 六、注意事项 1. 两个输入字符串都必须以`\0`结尾 2. 修改字符串时应确保目标内存可写(不能是字符串常量) 3. 返回的指针有效性依赖于原字符串的生命周期 4. 建议先进行NULL检查再使用返回值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值