Все выходы заканчиваются одинаково в C - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь перебрать key, который был введен в командной строке. Во время итерации я хочу создать 2 строки upper и lower, которые можно будет использовать позже. Проблема в том, что клавиши upper и lower имеют одинаковые выходные данные. Может ли кто-нибудь помочь мне понять, где я иду не так?

int main(int argc, char *argv[])  
{  
    if (argc != 2)  
    {  
        printf("Usage: ./substitution key\n"); // if no key is entered on command line, end program and say key  
        return 0;  
    }  

    string key = argv[1]; // convert command to key for ease  
    string alpha = "abcdefghijklmnopqrstuvwxyz";  // lowercase alphabet  
    string cap_alpha ="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //uppercase alphabet   
    string lower = argv[1]; // gives string correct length to edit later  
    string upper = argv[1]; // ^ditto  

    if (strlen(key) != 26) // if key is not exactly 26 char, end program and say it must contain 26  
    {  
        printf("Key must contain 26 characters\n");  
        return 0;  
    }  

    for (int i = 0; i < strlen(key); i++) //iterates through key  
    {  
        if (key[i] < 'A' || (key[i] > 'Z' && key[i] < 'a') || key[i] > 'z') //if key includes non alphabet characters, ends command  
        {  
            printf("Key must only contain alphabetic characters.\n");  
            return 0;  
        }  

        else if (key[i] >= 'A' && key[i] <= 'Z')  
        {  
            lower[i] += 32; // if char in key is uppercase, convert to lowercase, add to string "lower"  
            upper[i] = key[i]; // if char in key is uppercase, keeps as uppercase  
        }  
        else  
        {  
            upper[i] = key[i] - 32; // if char in key is lowercase, changes to uppercase  
            lower[i] = key[i];  
        }  
    }  

    printf("key: %s\n", key); // test output  
    printf("lower: %s\n", lower); //test output  
    printf("upper: %s\n", upper); // test output  
}  

1 Ответ

3 голосов
/ 17 января 2020

Назначение строк не делает копии, он просто назначает указатель на ту же строку. Так что key, upper, lower и argv[1] - это все одна и та же строка. Когда вы вносите изменения в один из них, это влияет на все из них.

Сначала вам нужно сделать копии.

size_t len = strlen(key) + 1; // +1 for the null byte
char upper[len], lower[len];
strcpy(upper, key);
strcpy(lower, key);

Кстати, C имеет функции isalpha(), isupper(), islower(), toupper() и tolower(). Вы должны использовать их вместо того, чтобы полагаться на специфику кодирования ASCII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...