所有输出最终都在C中相同

问题描述 投票:0回答:1

我正在尝试遍历已在命令行中输入的key。在迭代过程中,我想创建2个字符串upperlower,以后可以使用。问题在于键upperlower都以相同的输出结尾。有人可以帮我弄清楚我要去哪里哪里吗?

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  
}  
c for-loop
1个回答
0
投票

分配字符串不会产生副本,它只是将指针分配给相同的字符串。因此keyupperlowerargv[1]都是相同的字符串。当您更改其中之一时,它会影响所有这些。

您需要先进行复印。

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

BTW,C具有功能isalpha()isupper()islower()toupper()tolower()。您应该使用它们,而不要依赖ASCII编码的细节。

© www.soinside.com 2019 - 2024. All rights reserved.