1203081549 发表于 2023-4-19 17:31:43

字符串处理函数

void main()
       {
         char p="abcdefg";
         
         printf("%d\n",strlen(strcpy(p+3,"ABCD")));
         printf("%s",p);
       }
为什么长度会输出是呢,不应该是计算复制后的长度吗

isdkz 发表于 2023-4-19 17:34:47

这个程序使用了两个字符串处理函数:strlen() 和 strcpy()。程序的目的是计算复制后字符串的长度,并打印出结果。

这是程序的代码:

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

void main()
{
    char p="abcdefg";

    printf("%d\n",strlen(strcpy(p+3,"ABCD")));
    printf("%s",p);
}

首先,我们需要包含 <string.h> 头文件,这样才能使用字符串处理函数。

接下来,分析程序的主要部分:


[*]声明一个字符数组 p 并赋值为 "abcdefg"。
[*]使用 strcpy() 函数将 "ABCD" 复制到 p+3 处。此时 p 的内容变为 "abcABCD"。
[*]使用 strlen() 函数计算 p 的长度,结果是 7。
[*]使用 printf() 函数分别打印复制后字符串的长度(7)以及字符串本身("abcABCD")。



至于为什么长度是 7,这是因为 strlen() 函数计算的是传入参数字符串的长度,而不是复制操作本身的长度。

strcpy(p+3, "ABCD") 这个操作使得 "ABCD" 被复制到了 p 中的第四个字符(下标为 3)位置,替换了原先的 "defg"。

因此,复制后的字符串 p 是 "abcABCD",长度为 7。

1203081549 发表于 2023-4-19 17:37:56

isdkz 发表于 2023-4-19 17:34
这个程序使用了两个字符串处理函数:strlen() 和 strcpy()。程序的目的是计算复制后字符串的长度,并打印出 ...

您好,这个程序的输出结果是4而不是7

isdkz 发表于 2023-4-19 17:47:31

1203081549 发表于 2023-4-19 17:37
您好,这个程序的输出结果是4而不是7

抱歉,我之前的回答有误。现在来重新解释一下程序的输出。

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

void main()
{
    char p="abcdefg";

    printf("%d\n",strlen(strcpy(p+3,"ABCD")));
    printf("%s",p);
}

在这段代码中:


[*]声明一个字符数组 p 并赋值为 "abcdefg"。
[*]使用 strcpy() 函数将 "ABCD" 复制到 p+3 处。此时 p 的内容变为 "abcABCD"。
[*]使用 strlen() 函数计算 strcpy() 返回的字符串的长度。在这里,strcpy() 函数返回的是 p+3 的位置,即字符串 "ABCD" 的起始位置。因此,计算的长度为 4。
[*]使用 printf() 函数打印复制后字符串的长度(4)以及字符串本身("abcABCD")。


所以,这个程序的输出结果确实是 4 而不是 7。在 printf("%d\n",strlen(strcpy(p+3,"ABCD"))); 这一行中,strlen() 函数计算的是 strcpy() 返回值字符串的长度,strcpy() 返回值正是目标字符串的起始位置(在本例中为 p+3),即 "ABCD",其长度为 4。

1203081549 发表于 2023-4-19 17:55:54

isdkz 发表于 2023-4-19 17:47
抱歉,我之前的回答有误。现在来重新解释一下程序的输出。




您好我有时候计算strcat的时候也会遇到这样的情况,我是不是可以理解为strcpy ,strcat与strlen的混合使用中都统计的是他们的返回值的长度而不是拷贝或者连接后的完整长度

isdkz 发表于 2023-4-19 18:24:12

1203081549 发表于 2023-4-19 17:55
您好我有时候计算strcat的时候也会遇到这样的情况,我是不是可以理解为strcpy ,strcat与strlen的混合使 ...

您的理解是正确的。在 C 语言中,strcpy() 和 strcat() 都返回目标字符串的起始地址。当您将它们与 strlen() 混合使用时,strlen() 计算的实际上是这些函数返回值所指向的字符串的长度。


[*]strcpy():它将源字符串复制到目标字符串,并返回目标字符串的起始地址。
[*]strcat():它将源字符串追加到目标字符串的末尾,并返回目标字符串的起始地址。


当您将 strlen() 与这些函数混合使用时,请注意它们返回的字符串地址。例如,下面是 strcat() 的例子:
#include <stdio.h>
#include <string.h>

void main()
{
    char p = "abc";
    char q[] = "def";

    printf("%d\n", strlen(strcat(p, q)));
    printf("%s", p);
}

这段代码的输出将是:

6
abcdef

这里,strcat(p, q) 连接了字符串 p 和 q,并返回了目标字符串 p 的起始地址。因此,strlen(strcat(p, q)) 计算的是连接后字符串 "abcdef" 的长度,即 6。

总结一下,在使用 strlen() 与 strcpy() 或 strcat() 混合时,请注意返回的字符串地址。strlen() 函数将计算该地址所指向的字符串的长度。

1203081549 发表于 2023-4-19 19:33:27

1203081549 发表于 2023-4-19 19:33:59

isdkz 发表于 2023-4-19 17:47
抱歉,我之前的回答有误。现在来重新解释一下程序的输出。




大佬你好我还有最后一个问题就是strcpy strcat的组合是不是也符合这个规则呢

isdkz 发表于 2023-4-19 19:36:41

1203081549 发表于 2023-4-19 19:33
大佬你好我还有最后一个问题就是strcpy strcat的组合是不是也符合这个规则呢

是的,strcpy() 和 strcat() 的组合也符合这个规则。当您将这两个函数混合使用时,他们的返回值仍然是目标字符串的起始地址。

下面是一个例子:

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

void main()
{
    char p = "abc";
    char q[] = "def";
    char r[] = "ghi";

    printf("%d\n", strlen(strcat(strcpy(p, q), r)));
    printf("%s", p);
}

这段代码执行的操作是:


[*]使用 strcpy() 函数将字符串 q("def")复制到字符串 p。
[*]使用 strcat() 函数将字符串 r("ghi")追加到字符串 p 的末尾。
[*]使用 strlen() 函数计算返回值(目标字符串 p 的起始地址)所指向的字符串的长度。



这段代码的输出将是:

9
defghi

strcpy(p, q) 将字符串 "def" 复制到 p,返回 p 的起始地址。接着,strcat() 将字符串 "ghi" 追加到 p(此时为 "def")的末尾,结果为 "defghi",并返回 p 的起始地址。最后,strlen() 计算返回值所指向的字符串 "defghi" 的长度,即 9。

因此,在使用 strlen() 与 strcpy() 和 strcat() 的组合时,strlen() 函数计算的字符串长度仍然是目标字符串(即函数返回值所指向的字符串)的长度。
页: [1]
查看完整版本: 字符串处理函数