Назначение строк не делает копии, он просто назначает указатель на ту же строку. Так что 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.