Можно ли написать программу на C, которая функционирует по-другому в соответствии с argv [0]? - PullRequest
0 голосов
/ 26 сентября 2019

Можно ли написать программу на С, которая функционирует по-разному в соответствии с argv[0]?

На самом деле, я работаю над упражнением из учебника по Си.Упражнение заключается в написании программы, которая преобразует прописные буквы в строчные или прописные в верхние, в зависимости от имени, с которым она вызывается, как это найдено в argv[0].

[Edit] FYI, упражнение взято из учебника K & R

enter image description here

Ответы [ 3 ]

11 голосов
/ 26 сентября 2019

Можно ли написать программу на C, которая работает по-разному в соответствии с argv [0]?

Да, это возможно, очень просто.Например:

if (0 == strcmp(argv[0], "say_hello")) {
    printf("hello\n");
} else if (0 == strcmp(argv[0], "say_bye")) {
    printf("bye\n");
}
2 голосов
/ 26 сентября 2019

Ну, вы можете просто выбрать, какую функцию использовать, основываясь на имени программы

#include <string.h>
#include <ctype.h>

int     main(int ac, char **av)
{
    if (strcmp(av[0], "upper") == 0)
        do something;
    else if (strcmp(av[0] "lower") == 0)
        do something;
    return (0);
}
0 голосов
/ 27 сентября 2019

Да, безусловно, возможно.Чтобы правильно управлять 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, которое сообщает нам, сколько аргументов вы предоставили программе, или вы можете получить ошибки, если их недостаточно.

Это должно быть все, о чем просит ваше упражнение.

Надеюсь, я был чист.

...