C_字符串的一些函数

发布于:2024-12-06 ⋅ 阅读:(26) ⋅ 点赞:(0)

1.字符串输入函数

scanf("%s",数组名);

gets(数组名);

区别:

scanf(“%s”,数组名);  把空格识别为输入结束

#include <stdio.h>

int main()
{
    char a[10];

    printf("输入:");
    scanf("%s",a);
    //gets(a);

    printf("输出:%s\n",a);

    return 0;
}

gets(数组名);  可以识别空格字符到数组中

#include <stdio.h>

int main()
{
    char a[10];

    printf("输入:");
    //scanf("%s",a);
    gets(a);

    printf("输出:%s\n",a);

    return 0;
}

2.字符串输出函数

printf(“xxxx%s”,数组名);

puts(数组名);

区别:

printf可以放描述语

puts函数自动加换行符

3.计算字符串有效长度函数

计算字符串长度可以使用标准库中的 strlen 函数。这个函数位于 <string.h> 头文件中。

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

int main() 
{
    char str[] = "Hello, World!";
    size_t length = strlen(str);  // 计算字符串长度
    printf("Length of the string is: %zu\n", length);
    return 0;
}

sizeof   和  strlen 的区别?

sizeof:

属性 :是一个关键字

使用格式: int val = sizeof(变量名); 可以用于变量,数组

功能    :计算占用字节空间大小的

strlen:

属性 :是一个函数

使用格式: int val = strlen(数组名) ;只能用于数组(字符串)

功能    :计算字符串的有效长度

练习1:

char a[10] = “qwert”;

sizeof(a)    //10byte

strlen(a)    //5

练习2:

char a[] = “qwert”;

sizeof(a)    //6byte   

strlen(a)    //5

练习:自己写一个。

要求:

用户在主函数中输入一个字符串,

写一个子函数,子函数功能是接到主函数的字符串计算长度,并且返回具体长度值.

主函数调用子函数通过接收返回值来打印字符串的长度.

#include <stdio.h>

int my_strlen(char *str);

int main()
{
    char a[20];
    int len;
    printf("请输入一个字符串:\n");
    scanf("%s",a);

    len = my_strlen(a);
    printf("输入的字符串的长度为:%d",len);
    return 0;
}

/*******************************************************
函数名     :my_strlen
函数功能   :计数字符串的有效长度
函数参数   :char *str
函数返回值 :int
函数描述   :
*******************************************************/
int my_strlen(char *str)
{
    int cont = 0;
    int i = 0;
    while(*(str+i) != '\0')
    {
        cont++;
        i++;
    }
    return cont;
}

4.字符串复制函数

复制字符串可以使用标准库中的 strcpy 函数。这个函数位于 <string.h> 头文件中。

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

int main() {
    char src[] = "Hello, World!";
    char dest[50];  // 确保目标数组足够大

    strcpy(dest, src);  // 复制字符串

    printf("Source String: %s\n", src);
    printf("Destination String: %s\n", dest);

    return 0;
}

练习:自己写一个。

要求:

        用户输入两个字符串str1 和 str2

        要求写一个子函数将str2复制给str1

        打印复制后的str1

         char str1[] = “123456”;     

         char str2[] = “abcdef“;

        复制后:str1 : “abcdef“  

#include <stdio.h>

void my_strcpy(char *dest,char *src);

int main()
{
    char str1[50],str2[50];
    printf("请输入str1:");
    scanf("%s",str1);
    printf("请输入str2:");
    scanf("%s",str2);

    my_strcpy(str1,str2);
    printf("复制后的str1:%s",str1);

    return 0;
}


/*******************************************************
函数名     :my_strcpy
函数功能   :复制字符串
函数参数   :char *dest char *src
函数返回值 :无
函数描述   :函数会将字符串src复制给dest
*******************************************************/
void my_strcpy(char *dest,char *src)
{
    int i = 0;
    while(*(src+i) != '\0')
    {
        *(dest+i) = *(src+i);
        i++;
    }
    *(dest+i) = '\0';       //这句非常重要,否则当str1和str2长度不一致时会出现bug
}

假如没有加这一句:

*(dest+i) = '\0';

当str2长, str1短,  复制后str1会出现乱码,因为结束字符被覆盖了;(有些编译器在执行时会优化,不会出现乱码)

当str1长, str2短,  复制后str1会没有完全被覆盖;

可以注释掉这一句看看会发生什么。

5.字符串拼接函数 

字符串拼接可以使用标准库中的 strcat 函数。这个函数位于 <string.h> 头文件中。

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

int main() {
    char dest[50] = "Hello, ";  // 目标字符串,留出足够空间
    char src[] = "World!";

    // 使用 strcat 函数拼接字符串
    strcat(dest, src);

    printf("Concatenated String: %s\n", dest);

    return 0;
}

练习:自己写一个。

要求:

用户主函数中输入两个字符串str1和str2

写一个子函数实现将str2拼接到str1后面

str1:1234

str2:abcd

拼接后:str1:1234abcd

#include <stdio.h>

void my_strcat(char *dest,char *src);

int main()
{
    char str1[50],str2[50];
    printf("请输入str1:");
    scanf("%s",str1);
    printf("请输入str2:");
    scanf("%s",str2);

    my_strcat(str1,str2);
    printf("拼接后的str1:%s",str1);

    return 0;
}


/*******************************************************
函数名     :my_strcat
函数功能   :拼接字符串
函数参数   :char *dest char *src
函数返回值 :无
函数描述   :函数会将字符串src拼接在dest后
*******************************************************/
void my_strcat(char *dest,char *src)
{
    int i = 0,j = 0;
    while(*(dest+i) != '\0')
    {
        i++;
    }
    while(*(src+j) != '\0')
    {
        *(dest+i) = *(src+j);
        i++;
        j++;
    }
    *(dest+i) = '\0';
}

6.字符串比较函数

字符串比较可以使用标准库中的 strcmp 函数。这个函数位于 <string.h> 头文件中。

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

int main() {
    char str1[50], str2[50];
    
    printf("请输入第一个字符串: ");
    scanf("%s", str1);
    
    printf("请输入第二个字符串: ");
    scanf("%s", str2);
    
    int result = strcmp(str1, str2);

    if (result == 0) {
        printf("两个字符串相同。\n");
    } else if (result < 0) {
        printf("第一个字符串小于第二个字符串。\n");
    } else {
        printf("第一个字符串大于第二个字符串。\n");
    }

    return 0;
}

(库函数是从头开始逐个比较,只要出现不同的字符就立马返回结果) 

练习:自己写一个。

要求:

用户在主函数输入两个字符串,str1和str2,

在子函数中判断连个字符串是否相等,(长度要相等,对应字符一样)

相等返回0,不相等返回1;

(和库函数不太一样)

#include <stdio.h>

int my_strcmp(char *str1,char *str2);

int main()
{
    char str1[50],str2[50];
    int judge;
    printf("请输入str1:");
    scanf("%s",str1);
    printf("请输入str2:");
    scanf("%s",str2);

    judge = my_strcmp(str1,str2);
    if(judge == 0)
    {
        printf("字符串str1和字符串str2相同。");
    }
    else if(judge == 1)
    {
        printf("字符串str1和字符串str2不相同。");
    }


    return 0;
}


/*******************************************************
函数名     :my_strcmp
函数功能   :比较字符串
函数参数   :char *str1 char *str2
函数返回值 :int
函数描述   :比较字符串str1和字符串str2,如果相同则返回0,
            不相同则返回1.(长度和内容都相同)
*******************************************************/
int my_strcmp(char *str1, char *str2)
{
    // 定义循环索引变量
    int i = 0, j = 0, k = 0;

    // 遍历第一个字符串,找到结束符'\0'的位置
    while (*(str1 + i) != '\0')
    {
        i++;  // 递增索引
    }

    // 遍历第二个字符串,找到结束符'\0'的位置
    while (*(str2 + j) != '\0')
    {
        j++;  // 递增索引
    }

    // 如果两个字符串的长度相同
    if (i == j)
    {
        // 比较两个字符串的每一个字符
        while (*(str1 + k) != '\0')
        {
            // 如果某一位置的字符不同,返回1表示不相同
            if (*(str1 + k) != *(str2 + k))
            {
                return 1;  // 字符不同,返回1
            }
            k++;  // 继续比较下一个字符
        }
        return 0;  // 所有字符都相同,返回0
    }
    else  // 如果两个字符串的长度不同
    {
        return 1;  // 长度不同,返回1
    }
}

也可以这样写,这样比较像库函数的写法。

#include <stdio.h>

int my_strcmp(char *str1, char *str2);

int main()
{
    char str1[50], str2[50];
    int judge;
    printf("请输入str1: ");
    scanf("%s", str1);
    printf("请输入str2: ");
    scanf("%s", str2);

    judge = my_strcmp(str1, str2);
    if(judge == 0)
    {
        printf("字符串str1和字符串str2相同。\n");
    }
    else
    {
        printf("字符串str1和字符串str2不相同。\n");
    }

    return 0;
}

/*******************************************************
函数名     : my_strcmp
函数功能   : 比较字符串
函数参数   : char *str1, char *str2
函数返回值 : int
函数描述   : 比较字符串str1和字符串str2,如果相同则返回0,
            不相同则返回1。(长度和内容都相同)
*******************************************************/
int my_strcmp(char *str1, char *str2)
{
    while (*str1 != '\0' && *str2 != '\0')  // 同时遍历两个字符串
    {
        if (*str1 != *str2)  // 如果字符不相同,返回1
        {
            return 1;
        }
        str1++;
        str2++;
    }

    // 如果两个字符串长度不同,直接返回1
    if (*str1 != *str2)
    {
        return 1;
    }

    // 如果完全遍历过后两个字符串都相同,返回0
    return 0;
}

这是库函数的写法:

int my_strcmp( char *str1, char *str2) {
    while (*str1 != '\0' && *str2 != '\0') {
        if (*str1 != *str2) {
            return *str1 - *str2;  // 返回字符差值
        }
        str1++;
        str2++;
    }
    
    // 如果字符串都已结束,则比较长度
    return *str1 - *str2;
}

一些小题目练练手

1.编写程序,将用户输入的字符串中的所有的字符a用*代替,然后输出。

分析:

通过循环结构遍历每个字符并且判断是否为子符a,

如果是字符a,用*字符替换此元素

循环的条件  用户输入的字符串不是'\0'

2.输入一串字符,把其中的大写字母变成小写字母并输出

分析:

用户输入一个字符串,

通过循环结构遍历每个字符,

判断如果某个字符是大写的就把此元素替换为对应的字符小写

循环条件是  '\0'

3.写一函数判断一字符串是否为回文,是返回1,不是返回0,

"123321"              

"12321"

"asdffdsa"  

"asdfdsa"

分析:

用第一个 与最后一个比较 ,以此类推, 如果出现不相等的就不是回文

循环结构正常结束,就是回文。


1.

#include <stdio.h>


int main()
{
    char a[100];
    int i = 0;
    printf("请输入字符串:");
    scanf("%s",a);

    while(a[i] != '\0')
    {
        if(a[i] == 'a')
        {
            a[i] = '*';
        }
        i++;

    }
    printf("已经将所以'a'替换成了‘*’\n替换后的字符串为:%s",a);

    return 0;
}


2.

#include <stdio.h>


int main()
{
    char a[100];
    int i = 0;
    printf("请输入字符串:");
    scanf("%s",a);

    while(a[i] != '\0')
    {
        if(a[i] >= 'A'&& a[i] <='Z')
        {
            a[i] += 32;
        }
        i++;

    }
    printf("已经将所以大写字母替换成对应的小写字母\n替换后的字符串为:%s",a);

    return 0;
}


3.

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

int pal(char *str);

int main()
{
    char a[100];
    int judge;
    printf("请输入字符串:");
    scanf("%s",a);

    judge = pal(a);
    if(judge == 1)
    {
        printf("是回文");
    }
    else if(judge == 0)
    {
        printf("不是回文");
    }

    return 0;
}


 int pal(char *str)
 {
     int len = strlen(str);
     for(int i = 0 ;i < len/2;i++)
     {
         if(*(str+i) != *(str+len-1-i))
         {
             return 0;
         }
     }

     return 1;

 }