Почему strcpy меняет значение этого параметра? - PullRequest
0 голосов
/ 31 января 2020

Привет этот код я создал заглавными буквами. 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;
}

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Проблема в том, что функция capitalize преобразует все буквы в верхний регистр вместо . То есть строка, которую вы передаете в качестве аргумента, будет конвертируемой.

Если вы не хотите, чтобы исходная строка изменялась, вам нужно сделать это в два шага:

strcpy(stringTwo, string);  // First copy the original string
capitalize(stringTwo);  // Then make all letters upper-case in the copy
0 голосов
/ 31 января 2020

Поскольку вы меняете исходный (который является «строкой») и копируете его на новый (который является строкой два).

Если у вас есть возможность использовать отладчик, то вы увидите что в первую очередь вы меняете «строку».

Редактировать: Или вы можете попробовать это, если хотите: я немного изменил код.

    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);, и это будет делать то, что вы хотели.

...