One 许增宝

C语言中字符串处理函数
1、gets()#include <stdio.h> char *gets(char *s); 功能:...
扫描右侧二维码阅读全文
14
2019/04

C语言中字符串处理函数

1、gets()

#include <stdio.h>
char *gets(char *s);
功能:
    从标准输入读入字符,并保存到s指定的内存空间,直到出现换行符或读到文件结尾为止。
参数:
    s:字符串首地址
返回值:
    成功:读入的字符串
    失败:NULL

代码示例:

展开代码

//--------------- 不使用变量接收返回值 ----------------
#include <stdlib.h>
#include <stdio.h>
int main()
{
    // 这里要是写成 ch[] 会不通过,一般只有在定义并初始化的时候,才能这样写
    char ch[100];
    gets(ch);
    printf("%s", ch);
    system("pause");
    return 0;
}
/*
输入:hello world
输出:hello world
*/
//--------------- 使用变量接收返回值 ----------------
#include <stdlib.h>
#include <stdio.h>
int main()
{
    // 这里要是写成 ch[] 会不通过,一般只有在定义并初始化的时候,才能这样写
    char ch[100];
    char *p = gets(ch);
    printf("%s", p);
    system("pause");
    return 0;
}
/*
输入:hello world
输出:hello world
*/

get() 与 scanf() 的区别:区别是 scanf 输入不能包含空格,而 gets 可以。

注意: scanf 和 gets 都不知道字符串的大小,必须读到字符串结尾或者遇到换行符才停止,因此容易导致字符数组越界,即缓冲区溢出。

2、puts()

#include <stdio.h>
int puts(const char *s);
功能:
    标准设备输出s字符串,在输出完成后自动输出一个'\n'。
参数:
    s:字符串首地址
返回值:
    成功:非负数
    失败:-1

代码示例:

展开代码

//--------------- 不使用变量接收返回值 ----------------
#include <stdlib.h>
#include <stdio.h>
int main()
{
    // 这里要是写成 ch[] 会不通过,一般只有在定义并初始化的时候,才能这样写
    char ch[100];
    gets(ch);
    puts(ch);
    system("pause");
    return 0;
}
/*
输入:hello world
输出:hello world                        // 这里多一行换行
     
*/
//--------------- 使用变量接收返回值 ----------------
#include <stdlib.h>
#include <stdio.h>
int main()
{
    // 这里要是写成 ch[] 会不通过,一般只有在定义并初始化的时候,才能这样写
    char ch[100];
    gets(ch);
    int x = puts(ch);
    printf("%d", x);
    system("pause");
    return 0;
}
/*
输入:hello world
输出:hello world                       // 换行后再打印返回值
     0
*/

3、fgets()

#include <stdio.h>
char *fgets(char *s,int size,FILE *stream);
功能:
    从stream指定的文件内读入字符,保存到s所指定的内存空间,直到出现换行符、读到文件结尾或是已读了size-1个字符为止,最后会自动加上字符'\0'作为字符串结束。
参数:
    s:字符串
    size:指定最大读取字符串长度(size-1)
    stream:文件指针,如果读键盘输入的字符串,固定写为stdin
返回值:
    成功:成功读取的字符串
    读到文件结尾出错:NULL

代码示例:

展开代码

//---------------- 不使用变量接收返回值且读取字符串长度小于定义得字符串数组长度 ------------------
#include <stdlib.h>
#include <stdio.h>
int main()
{
    char ch[100];
    // fgets() 函数可以捕捉一个换行,前提是 size 大于读取字符串长度
    // 参数:字符指针, 大小, 文件流
    fgets(ch, 100, stdin);
    printf("%s", ch);

    system("pause");
    return 0;
}
/*
输入:hello world
输出:hello world                        // 这里多一行换行
     
*/
//---------------- 使用变量接收返回值且读取字符串长度小于定义得字符串数组长度 ------------------
#include <stdlib.h>
#include <stdio.h>
int main()
{
    char ch[100];
    // fgets() 函数可以捕捉一个换行,前提是 size 大于读取字符串长度
    // 参数:字符指针, 大小, 文件流
    char *p = fgets(ch, 100, stdin);
    printf("%s", p);
    system("pause");
    return 0;
}
/*
输入:hello world
输出:hello world                        // 这里多一行换行
     
*/
//---------------- 不使用变量接收返回值且读取字符串长度大于定义得字符串数组长度 ------------------
#include <stdio.h>
int main()
{
    char ch[10];
    // fgets() 函数可以捕捉一个换行,前提是 size 大于读取字符串长度
    // 参数:字符指针, 大小, 文件流
    fgets(ch, 10, stdin);
    printf("%s", ch);
    system("pause");
    return 0;
}
/*
输入:hello world
输出:hello wor   
*/

注意: fgets() 与 gets() 和 scanf() 相比, fgets() 不会出现缓存区溢出得情况。

4、fputs()

#include <stdio.h>
int fputs(const char * str, FILE * stream);
功能:
     将str所指定的字符串写入到stream指定的文件中, 字符串结束符 '\0'  不写入文件。 fputs()是puts()的文件操作版本,但fputs()不会自动输出一个'\n'。
参数:
    str:字符串
    stream:文件指针,如果把字符串输出到屏幕,固定写为stdout
返回值:
    成功:0
    失败:-1

展开代码

代码示例:

//----------------------- 不使用变量接收返回值 ----------------------
#include <stdio.h>
int main()
{
    char ch[100] = "hel\0o world";
    // 参数:字符指针,流
    fputs(ch, stdout);
    system("pause");
    return 0;
}
/*
输入:hel\0lo world
输出:hello wor   
*/
//----------------------- 使用变量接收返回值 ----------------------
#include <stdio.h>
int main()
{
    char ch[100] = "hel\0o world";
    // 参数:字符指针,流
    int num = fputs(ch, stdout);
    printf("%d", num);
    system("pause");
    return 0;
}
/*
输入:hel\0lo world
输出:hello wor0  
*/

5、strlen()

#include <string.h>
size_t strlen(const char *s);
功能:
    计算指定指定字符串s的长度,不包含字符串结束符‘\0’
参数:
    s:字符串首地址
返回值:
    字符串s的长度,size_t为unsigned int类型

代码示例:

展开代码

1.对char ch1[] = "hello";char ch2[] = { 'h', 'e', 'l', 'l', 'o' };输出不同结果:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch1[] = "hello";
    char ch2[] = { 'h', 'e', 'l', 'l', 'o' };
    printf("%d\n", strlen(ch1));
    printf("%d\n", strlen(ch2));

    system("pause");
    return 0;
}
/*
输出结果:5
         21
*/

2.对char ch1[10] = "hello";char ch2[10] = { 'h', 'e', 'l', 'l', 'o' };输出相同结果:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch1[10] = "hello";
    char ch2[10] = { 'h', 'e', 'l', 'l', 'o' };
    printf("%d\n", strlen(ch1));
    printf("%d\n", strlen(ch2));

    system("pause");
    return 0;
}
/*
输出结果:5
         5
*/

6、strcpy()

#include <string.h>
char *strcpy(char *dest, const char *src);
功能:
    把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去
参数:
    dest:目的字符串首地址
    src:源字符首地址
返回值:
    成功:返回dest字符串的首地址
    失败:NULL

代码示例:

展开代码

int main()
{
    char ch1[10] = "hello";
    char ch2[10];
    // 目标字符串,源字符串
    strcpy(ch2, ch1);
    printf("%s\n", ch2);
    system("pause");
    return 0;
}
/*
输出结果:hello
*/

注意:上面代码如果写成 strcpy(ch1, ch2) 则在运行时会报错!另外,如若目标字符串长度小于源字符串长度的话,可能会缓存区溢出报错!

7、strncpy()

#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);
功能:
    把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符看指定的长度是否包含'\0'。
参数:
    dest:目的字符串首地址
    src:源字符首地址
    n:指定需要拷贝字符串个数
返回值:
    成功:返回dest字符串的首地址
    失败:NULL

代码示例:

展开代码

//--------------- 不做任何处理(未加 \0) ----------------
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch1[10] = "hello";
    char ch2[10];
    // 目标字符串,源字符串,字符长度
    // 注意,有限拷贝不会将 \0 拷贝到目标字符串中
    strncpy(ch2, ch1, 5);
    printf("%s\n", ch2);
    system("pause");
    return 0;
}

/*
输出结果:hello烫烫烫烫烫烫烫蘦ello
*/

注意:有限拷贝不会将 0 拷贝到目标字符串中。



//--------------- 做 \0 处理 ----------------
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch1[10] = "hello";
    char ch2[10];
    // 目标字符串,源字符串,字符长度
    strncpy(ch2, ch1, 5);
    
    
    // 有限拷贝后手动添加 \0
    ch2[5] = '\0';      // 或 ch[5] = 0;
    
    
    printf("%s\n", ch2);
    system("pause");
    return 0;
}

/*
输出结果:hello
*/

8、strcat()

#include <string.h>
char *strcat(char *dest, const char *src);
功能:
    将src字符串连接到dest的尾部,‘\0’也会追加过去
参数:
    dest:目的字符串首地址
    src:源字符首地址
返回值:
    成功:返回dest字符串的首地址
    失败:NULL

代码示例:

展开代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch1[100] = "hello";
    char ch2[] = "world";
    // 追加时先去掉目标字符串尾部 \0, 然后再追加
    // 这里为了在后添加得字符串之前加一个空格
    strcat(ch1, " ");
    strcat(ch1, ch2);
    printf("%s\n", ch1);

    system("pause");
    return 0;
}

/*
输出结果:hello world
*/

注意:考虑是否存在缓存区溢出问题!

9、strncat()

#include <string.h>
char *strncat(char *dest, const char *src, size_t n);
功能:
    将src字符串前n个字符连接到dest的尾部,‘\0’也会追加过去
参数:
    dest:目的字符串首地址
    src:源字符首地址
    n:指定需要追加字符串个数
返回值:
    成功:返回dest字符串的首地址
    失败:NULL

代码示例:

展开代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch1[100] = "hello";
    char ch2[] = "world";
    // 有限追加也会将 \0 追加
    strncat(ch1, ch2, 2);
    printf("%s\n", ch1);

    system("pause");
    return 0;
}

/*
输出结果:hellowo
*/

10、strcmp()

#include <string.h>
int strcmp(const char *s1, const char *s2);
功能:
    比较 s1 和 s2 的大小,比较的是字符ASCII码大小。
参数:
    s1:字符串1首地址      
    s2:字符串2首地址
返回值:
    相等:0
    大于:>0     在不同操作系统中返回值不同,所以一般只比较是否相等!
    小于:<0

代码示例:

展开代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch1[100] = "hello\0";
    char ch2[] = "hello";
    // 比较到第一个 \0 前的所有有效字符
    printf("%d\n", strcmp(ch1, ch2));
    system("pause");
    return 0;
}

/*
输出结果:0
*/

11、strncmp()

#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);
功能:
    比较 s1 和 s2 前n个字符的大小,比较的是字符ASCII码大小。
参数:
    s1:字符串1首地址
    s2:字符串2首地址
    n:指定比较字符串的数量
返回值:
    相等:0
    大于: > 0
    小于: < 0

代码示例:

展开代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch1[100] = "hello\0";
    char ch2[] = "hello";
    // 比较有限个字符是否相等
    printf("%d\n", strncmp(ch1, ch2, 3));
    system("pause");
    return 0;
}

/*
输出结果:0
*/

13、sprintf()

#include <stdio.h>
int sprintf(char *str, const char *format, ...);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符 '\0'  为止。
参数:
    str:字符串首地址
    format:字符串格式,用法和printf()一样
返回值:
    成功:实际格式化的字符个数
    失败: - 1

代码示例:

展开代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch1[100] = "hello";
    int num = 123;
    char ch2[100];

    sprintf(ch2, "%s %d", ch1, num);

    printf("%s\n", ch2);
    system("pause");
    return 0;
}

/*
输出结果:hello 123
*/

14、sscanf()

#include <stdio.h>
int sscanf(const char *str, const char *format, ...);
功能:从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。
参数:
    str:指定的字符串首地址
    format:字符串格式,用法和scanf()一样
返回值:
    成功:参数数目,成功转换的值的个数
    失败: - 1

代码示例:

展开代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch1[100];
    int num = 0;
    char ch2[100] = "hello 123";
    // 对字符串进行拆解
    // 参数:要拆解的字符串,拆解格式,要存储的字符串
    sscanf(ch2, "%s %d", ch1, &num);

    printf("%s\n", ch1);
    printf("%d\n", num);

    system("pause");
    return 0;
}
/*
输出结果:hello
         123
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    int a, b;
    char ch2[100] = "1+2=";
    // 对字符串进行拆解
    // 参数:要拆解的字符串,拆解格式,要存储的字符串
    // 这里中间的参数要按拆解字符串的格式写
    sscanf(ch2, "%d+%d=", &a, &b);

    printf("%d+%d=%d\n", a, b, a+b);

    system("pause");
    return 0;
}

/*
输出结果:1+2=3
*/

15、strchr()

#include <string.h>
char *strchr(const char *s, int c);
功能:
    在字符串s中查找字母c出现的位置
参数:
    s:字符串首地址
    c:匹配字母(字符)
返回值:
    成功:返回第一次出现的c地址
    失败:NULL

代码示例:

展开代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch2[100] = "hello world";
    
    char * p = strchr(ch2, 'o');

    printf("%s\n", p);

    system("pause");
    return 0;
}

/*
输出结果:o world
*/

16、strstr()

#include <string.h>
char *strstr(const char *haystack, const char *needle);
功能:
    在字符串haystack中查找字符串needle出现的位置
参数:
    haystack:源字符串首地址
    needle:匹配字符串首地址
返回值:
    成功:返回第一次出现的needle地址
    失败:NULL

代码示例:

展开代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch2[100] = "hell哈o world";
    
    char * p = strstr(ch2, "哈");

    printf("%s\n", p);

    system("pause");
    return 0;
}
/*
输出结果:哈o world
*/

17、strtok()

#include <string.h>
char *strtok(char *str, const char *delim);
功能:来将字符串分割成一个个片段。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时, 则会将该字符改为\0 字符,当连续出现多个时只替换第一个为\0。
参数:
    str:指向欲分割的字符串
    delim:为分割字符串中包含的所有字符
返回值:
    成功:分割后字符串首地址
    失败:NULL
  • 在第一次调用时:strtok()必需给予参数s字符串。
  • 往后的调用则将参数s设置成NULL,每次调用成功则返回指向被分割出片段的指针。

代码示例:

展开代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch2[100] = "www.baidu.com";
    
    // 第一个参数为开始切的字符
    char * p = strtok(ch2, ".");
    while (p != NULL)
    {
        printf("%s\n", p);
        p = strtok(NULL, ".");
    }

    system("pause");
    return 0;
}

/*
输出结果:www
          baidu
          com
*/

18、字符串转换函数

#include <stdlib.h>
int atoi(const char *nptr);
功能:
    atoi()会扫描nptr字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符串结束符('\0')才结束转换,并将结果返回返回值。
参数:
    nptr:待转换的字符串
返回值:成功转换后整数

atof():把一个小数形式的字符串转化为一个浮点数。

atol():将一个字符串转化为long类型。

代码示例:

展开代码

//--------------- atoi ----------------
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
    char ch[100] = "   100";
    // 自动跳过前面的空格,如果数字前面有字母则打印为0
    int a = atoi(ch);
    printf("%d\n", a);

    system("pause");
    return 0;
}

/*
输出结果:100
*/


才识有限,如果哪里有错误或有任何建议等,欢迎评论指正!谢谢!

最后修改:2019 年 04 月 24 日 08 : 32 PM

发表评论