strlen,strcpy与strcnpy,strcat与strncat,strcmp 与 strncmp几个讲解

1.获取字符串的长度:strlen
指的是字符串的长度,不会包含\0

2.拷贝字符串:strcpy,strcnpy
strcpy(str1,str2)
把str2的东西拷贝给str1变成一样的 如果str1字符串为wangxinhua str2为heiheihei
把str1拷贝给str2的话那么会造成溢出,越界了。只能拷贝相同的字符长度

strcnpy(str1,str2,5(拷贝5个字符这里不包括\0))
例如:
char str1[] = "wang xin hua";
char str2[40];
strcnpy(str1,str2,5)
str2[5] = '\0'//这里需要手动添加结束符
printf("str2=%s\n",str2);

strncpy 的例子
int main()
{
    char str1[] = "To be or not to be";
    char str2[19];
    char str3[40];

    strncpy(str2, str1, sizeof(str2));//这里的意思是把str2里面的全部拷贝出来
    strncpy(str3, str2, 5);//这里只拷贝5个字符
    str3[5] = '\0';//这个加在了e后面 空格也算一个字符

    printf("%s\n", str1);
    printf("%s\n", str2);
    printf("%s\n", str3);

    return 0;
}

3.连接字符串:strcat和strncat
这俩个的区别在于strncat需要手动添加\0
char str1[100] = "wang x h";
char str2[] = "hei hei hei";
strcat(str1, " ");
strcat(str1, str2);
printf("str1: %s\n", str1);

strncat的例子

int main()
{
        char str1[20] = "I";
        char str2[20] = "love ";
        char str3[20] = "FishC.com!";

        strncat(str1, " ","\0");//"\0"这样可以连接两个字符串
        strncat(str1, str2,"\0");//也可以把"\0"换成5,意思就是把需要连接的字符中占5个字节的字符连接到str1去

        strncat(str1, str3,"\0");//这里和上面一样可以随便用那种记住连接连个字符的时候看清需要的那个字符串是多少字节的

        printf("str1: %s\n", str1);

        return 0;
}

4.对比两个字符:strcmp 与 strncmp

 strncmp的例子

int main()
{
        char str1[40] = "FishC";
        char str2[40] = "FishC.com";

        if (!strncmp(str1, str2, 5))//比较前5个字符是否相同
        {
                printf("str1和str2前5个字符相同!\n");
        }
        else
        {
                printf("str1和str2前5个字符不同!\n");
        }

        return 0;
}

总结:发现没 这几个带n的限制条件的是不是(目标字符,源字符,任意字节数)源字符后面是不是可以随意定义要多少个字符的大小。

练习1:请问下边会打印什么内容
int main()
{
    char str[] = "wang xin hua";
    str[7] = "\0";

    printf("sizeof str = %d\n",sizeof(str));
    printf("strlen str = %d\n",sizeof(str));
    return 0;
}

这里就是求出字符长度的大小;

练习二
C 标准的 strncpy 函数经常被推荐作为一种替代 strcpy 函数,但不幸的是 strncpy 函数也会存在一些风险,你知道是什么吗?
安全的做法是:
int main()
{
    ……
    strncpy(str1, str2, n);
    str1[sizeof(str1) - 1] = '\0';
    ……
}

这里就是\0的问题

练习三
写一个程序模仿 strncmp 函数的实现比较两个字符串 s1 和 s2,需要满足以下要求
#define MAX 1000
int main()
{
    char str1[MAX];
    char str2[MAX];
    int i = 0;
    unsigned int n;
    printf("请输入你想要输入的字符串");
    while((str1[i++] = getchar()!='\n'));

    printf("请输入第二组字符串");
    i = 0;
    while((str2[i++] = getchar()!= '\n'));

    printf("请输入想要比较的字符数");
    scanf("%u",&n);

    for(i = 0;i < n;i++)
    {
        if(str1[i]-str2[i])
        {
            i++;
            break;
        }
    }

    printf("比较的结果是:%d\n",str1[i-1] - str2[i-1]);
    return 0;
}
练习4:这里就是上面的改版
要求 A:定义一个长度为 21 的字符数组,用于存放用户输入的文本;
要求 B:如果用户输入的文本长度超过 20 个字符,且文本中存在空格,则截取至最接近末尾(第 20 个字符串)的空格;
要求 C:如果用户输入的文本长度超过 20 个字符,且文本中不存在空格,则打印前 20 个字符。

#define MAX 21
int main()
{
    int ch,space,i = 0;//定义3个变量
    char str[MAX];//定义最大值类型

    space = MAX -1;//索引下标移动到第20

    printf("请输入一行文本:");
    while((ch = getchar())!='\n')//接收用户输入的数据
    {
        str[i++] = ch;
        if(i == MAX - 1)
        {
            break;
        }
        if(ch == ' ')
        {
            space = i;
        }
    }
    if(i >= MAX -1)
    {
        str[space] = '\0';//超过了的话就在索引20的位置结束
    }
    else
    {
        str[i] = '\0';//没有超过直接结束
    }

    printf("你输入的文本是:%s\n",str);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_61882129/article/details/121926437
今日推荐