Да, безусловно, возможно.Чтобы правильно управлять char
значениями в этом упражнении, я бы предложил использовать ASCII
таблицы, которые вы можете просмотреть здесь
Идея такова: мы знаем, что заглавные буквы начинаются с десятичнойзначение 65 и заканчивается значением 90. Строчные буквы начинаются с 97 и заканчиваются значением 122.
Теперь, если у нас есть, например, буква D
, десятичное значение которой равно 68, чтобы она сталав нижнем регистре нам просто нужно добавить 32, что становится 68 + 32 = 100, что в точности равно значению строчной буквы 'd'
.
Аналогично, если у нас есть строчная буква j
, значение которой равно 106. Мывычтите 32, получив 74, и это точное значение заглавной буквы 'J
.
Эти две функции используют предыдущий метод для преобразования соответственно строчных букв в прописные и наоборот.
void toLower(char *string){
//For any letter in *string
for(int i = 0; i < strlen(string); i++){
//If letter at index I is really uppercase
if(string[i] >= 65 && string[i] <= 90)
//it becomes lowercase by adding 32 to its ASCII value
string[i] += 32;
}
}
void toUpper(char *string){
//For any letter in *string
for(int i = 0; i < strlen(string); i++)
//If letter at index I is really Lowercase
if(string[i] >= 97 && string[i] <= 122)
//it becomes Uppercase by adding 32 to its ASCII value
string[i] -= 32;
}
Теперь основная функция:
int main(int argc, char *argv[]){
//Taking program name from argv[0]
char *upperOrLower = argv[0];
//Adding 2 to Program Name in order to remove characters '.' and '/' from String
upperOrLower += 2;
//Retrieving String given as argument
char *string = argv[1];
//If Program Name is lower
if(strcmp(upperOrLower, "lower") == 0){
//We have Uppercase string, so we use toLower function
printf("String before calling toLower: %s\n", argv[1]);
toLower(string);
printf("String after calling toLower: %s\n", string);
}
//Else if we have upper as program name
else if(strcmp(upperOrLower, "upper") == 0){
//We have Lowercase string, so we use toUpper function
printf("String before calling toUpper: %s\n", string);
toUpper(string);
printf("String after calling toUpper: %s\n", string);
}
}
Теперь скомпилировав вышеуказанную программу как:
gcc program.c -o upper
и выполнив ее, набрав:
./upper hello
Вывод должен быть:
String before calling toUpper: hello
String after calling toUpper: HELLO
И наоборот, если мы скомпилируем его, набрав:
gcc program.c -o lower
, а затем выполним его, набрав: ./lower HELLO
Мы должны получить вывод:
String before calling toLower: HELLO
String after calling toLower: hello
Возможно, вы захотитедобавить значение проверки argc
, которое сообщает нам, сколько аргументов вы предоставили программе, или вы можете получить ошибки, если их недостаточно.
Это должно быть все, о чем просит ваше упражнение.
Надеюсь, я был чист.