0

有我朋友的代码,我正在看。这是一个使用字符串函数的简单示例,我觉得这并不简单。问题是第(5)部分。

这是代码。

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

void reverse(char *str1, char *str2) {
     str1 = strrev(str2);
     printf("%s\n\n", str1);    //**It's a test.**
}

int main() {
    char str1[100];
    char str2[100];
    char str3[100];
    char str4[100];
    char temp[100];
    int len1, len2, len3, len4;

    //(1) use scanf()
    printf("(1) str1 : ");
    scanf("%s", &str1);
    printf("    str2 : ");
    scanf("%s", &str2);

    //(2) exchange, print()
    strcpy(temp, str1);
    strcpy(str1, str2);
    strcpy(str2, temp);
    printf("(2) str1=%s str2=%s\n", str1, str2);
    printf("len1=%d len2=%d\n", strlen(str1), strlen(str2));

    //(3) copy, print()
    strcpy(str3, str2);
    printf("(3) str3=%s\n", str3);

    //(4) strcat()
    strcat(str3, " ");
    strcat(str3, str1);
    strcat(str3, " My name is Elsa");
    printf("(4) str3=%s\n", str3);
    printf("len3=%d\n", strlen(str3));

    //(5) reverse(str4,  str3), print str4
    reverse(str4, str3);
    printf("(5) str4=%s\n", str4);    //**I don't know here**
    printf("len4=%d\n", strlen(str4));

    return 0;
}

这就是结果。

在此处输入图像描述

为什么会有垃圾值?

4

2 回答 2

1

在这次通话中

reverse(str4, str3);

数组str4是按值传递的。因此,str4用作参数的表达式被转换为指向数组第一个元素的临时指针。

因此,该函数reverse处理这个临时对象,该对象用作函数参数的初始值设定项。

更改此参数(函数的局部变量)不会影响原始数组的内容。它保持不变。

也就是在这个函数里面的语句

str1 = strrev(str2);

实际上指针str2是赋值给指针的str1。指针 str2 指向的字符串将被更改。至于指针str1,它现在指向与指针相同的字符串,str1退出函数后它将不再存在。

如果要更改函数的第一个参数指向的字符串,可以通过以下方式定义函数

void reverse(char *str1, char *str2) {
     strcpy( str1, strrev(str2) );
     printf("%s\n\n", str1);    //**It's a test.**
}

然而,该函数没有多大意义,因为它同时反转两个字符串。

如果要将函数的第二个参数指向的字符串的内容复制到函数的第一个参数指向的数组中,那么函数定义可以如下所示

void reverse( char *str1, const char *str2 ) 
{
     strcpy( str1, str2 );

     strrev( s1 );

     printf("%s\n\n", str1);    //**It's a test.**
}

在这种情况下,指针指向的字符串str2将保持不变,而指针指向的数组str1将得到指针指向的反转字符串str2

于 2020-04-12T15:41:29.823 回答
0

您的函数声明应如下所示,

void reverse(char **str1, char *str2)

因此不想只在本地进行操作。

于 2020-04-12T15:44:06.150 回答