Изменение регистра строки - PullRequest
0 голосов
/ 30 января 2019

Я новичок в C и пытаюсь написать простую функцию, которая может принимать строку (или массив символов) и преобразовывать ее регистр на основе следующих правил:

  1. Первоесимвол должен быть заглавнымчто не так.Вот что я написал:
    void myFunction(char name[]) {
    
      printf("Before: %s", name);
    
      name[0] = toupper(name[0]); // This line seems to cause problems.
    
      // Convert the other letters to lowercase if they aren't already.
      for(int i = 1; name[i] != '\0'; i++) {
        if(islower(name[i])) {
          name[i] = tolower(name[i]);
        } else {
          name[i] = name[i];
        }
      }
      name[i] = '\0';
    
      printf("After: %s", name);
    }
    
    
    void my_caller(*name1) {
      printf("Name before changing case: %s\n", name1);
      myFunction(name1);
      printf("Name after changing case: %s\n", name1);
    }
    
    
    // In another .c file.
    int main() {
      char name1[] = "adam";
      my_caller(&name1);
    }
    

    В myFunction, если я закомментирую строки за исключением

    name[0] = toupper(name[0]);
    

    , я все еще получаю ошибку сегментации.Таким образом, можно предположить, что эта линия является (одним из) виновников, но я не понимаю, почему.Я хочу преобразовать букву в верхний регистр и вернуть ее обратно в строку.

1 Ответ

0 голосов
/ 30 января 2019

Начнем с того, что определение функции типа

 void my_caller(name1) 

проблематично, так как отсутствующий тип (раньше был устаревшим правилом) по умолчанию равен int.Вы хотите, чтобы это было char *.не int.

Вам нужно изменить его на

  void my_caller(char * name1) {.... 

Более того, вам нужно вызвать функцию как my_caller(name1);, передача массива аналогична передаче указателя напервый элемент массива.

Кроме того, вы не передаете адрес массива (проверьте типы, если вы в замешательстве) при вызове функции.

Тем не менее, внутри myFunction() область видимостиi ограничен только циклом for, но вы хотите использовать его за пределами области действия (для завершения с нулем), поэтому вам нужно объявить i в области действия функционального блока.

Мораль истории: включите настройки предупреждения / ошибки компилятора и обратите пристальное внимание на сообщения, генерируемые компилятором.Они есть по какой-то причине.


Примечание. После внесения этих изменений код работает как положено .

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