为什么strcpy会更改这一参数的值?

为什么strcpy会更改这一参数的值?,c,string,strcpy,C,String,Strcpy,嗨,我创建的这段代码是大写字母。strcpy设法将string的值复制到stringTwo,但是我想知道,如果我只是将string用作参数,strcpy为什么也会更改string的值。谢谢 #include <stdio.h> #include <string.h> char *capitalize(char *str) { int i; for (i = 0; i < strlen(str); i++) { if (str[i

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

#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;
}
#包括
#包括
字符*大写(字符*str){
int i;
对于(i=0;i如果(str[i]>=97&&str[i]则问题在于
大写
函数将所有字母转换为大写字母。也就是说,作为参数传递的字符串将是被转换的字符串

如果不希望修改原始字符串,则需要分两步执行:

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

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

如果不希望修改原始字符串,则需要分两步执行:

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

因为您正在更改原始文件(即“字符串”)并将其复制到新文件(即stringTwo)

如果您有机会使用调试器,那么首先会看到您正在更改“字符串”

编辑: 如果您愿意,也可以尝试以下方法: 我稍微修改了一下代码

    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;
}
char*大写(char*str,char*str2){
strcpy(str2,str);
int i;
对于(i=0;i如果(str2[i]>=97&&str2[i],因为您正在更改原始文件(即“string”)并将其复制到新文件(即stringTwo)

如果您有机会使用调试器,那么首先会看到您正在更改“字符串”

编辑: 如果您愿意,也可以尝试以下方法: 我稍微修改了一下代码

    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;
}
char*大写(char*str,char*str2){
strcpy(str2,str);
int i;
对于(i=0;i如果(str2[i]>=97&&str2[i]
strcpy()
不改变
string
的值,但
capitalize()
改变了它的值!请不要这样使用或编码特定的代码。你真正需要的是函数,你甚至不需要检查字符是小写还是大写(或者确实是字母)首先,为什么要使用值97和122?改用“a”和“z”使代码更易于阅读,并且不要在for循环内调用
strlen()
,因为长度将不必要地反复计算
strcpy()
不会更改
字符串的值,而是
大写()
是的!请不要这样使用或编码特定的代码。您真正需要的只是函数,甚至不需要先检查字符是小写还是大写(或者确实是字母)。为什么要使用值97和122?使用'a'和'z'来代替?使代码更易于阅读,并且不调用
strlen()
在for循环内部,因为长度将被不必要地再次计算和重新计算;或者
大写(strcpy(stringTwo,string));
如果需要一步…好的,看起来很难看…或者
大写(strcpy(stringTwo,string));
如果需要一步…好的,看起来很难看。。。