为什么strcpy会改变这个参数的值呢?

Why does strcpy change the value of this one parameter?

嗨,我创建的这段代码将小写字母大写。 strcpy 设法将字符串的值复制到 stringTwo,但是我想知道如果我只是将它用作参数,为什么 strcpy 也会更改字符串的值。谢谢

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

char *capitalize(char *str) {

    int i;
    for (i = 0; i < strlen(str); i++) {

        if (str[i] >= 97 && str[i] <= 122) {

            str[i] -= 32;

        }

    }

    return str;
}

int main() {

    char string[21];
    char stringTwo[21];

    printf("Enter string: ");
    scanf("%20s", string);

    strcpy(stringTwo, capitalize(string));

    printf("\n%s\ncapitalized: %s", string, stringTwo);

    return 0;
}

问题是 capitalize 函数将所有字母转换为大写 到位 。也就是说,您作为参数传递的字符串将被转换。

如果不想修改原字符串,需要分两步进行:

strcpy(stringTwo, string);  // First copy the original string
capitalize(stringTwo);  // Then make all letters upper-case in the copy

因为你正在改变原来的(即"string")并将其复制到新的(即stringTwo)。

如果您有机会使用调试器,那么您会首先看到您正在更改 "string"。

编辑: 或者,如果您愿意,可以试试这个: 我稍微更改了代码。

    char *capitalize(char *str,char *str2) {
    strcpy(str2, str);
    int i;
    for (i = 0; i < strlen(str2); i++) {

        if (str2[i] >= 97 && str2[i] <= 122) {

            str2[i] -= 32;

        }

    }

    return str2;
}

通过函数中的这一小改动,您完成了函数中的所有工作。您只需键入 capitalize(string,stringTwo);,这将执行您想要的操作。