Почему я продолжаю получать дамп сегментации?

Мне нужно создать программу, которая сортирует одно слово по алфавиту, и это нужно сделать с помощью массивов и указателей.

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

void main(void)
{
  int num;
  double swap1 = 18.4 , swap2 = 95.73;
  char theString[50];
  char beginning, ending;
  printf("Enter a number:\n");
  scanf("%d", &num);
  doubleme(&num);
  printf("%d is the value you entered doubled.\n", num);
  printf("Before swapping value a is %lf and value b is %lf\n", swap1, swap2);
  swap(&swap1, &swap2);
  printf("After swapping value a is %lf and value b is %lf\n", swap1, swap2);
  printf("Enter a word and I will tell you the first and last character of the alphabet within it.\n");
  scanf("%s", theString);
  firstLast(theString, &beginning, &ending);
  printf("%s is the first character and %s is the last.\n", beginning, ending);
}

void doubleme(int *x)
{
  *x = 2 * *x;
}

void swap(double *a, double *b)
{
  double temp;
  temp = *a;
  *a = *b;
  *b = temp;
}

void firstLast(char theString[], char *first, char *last)
{
  int i, j, n;
  n = strlen(theString);
  char temp;
  printf("%c\n", theString[4]);
  for(i = 0; i < (n - 1); i++)
  {
    for(j = 0; j < (n - 1); j++)
    {
      if (theString[j] > theString[(j+1)])
      {
        temp = theString[j];
        theString[j] = theString[(j+1)];
        theString[(j+1)] = temp;
      }
    }
  }
  *first = theString[0];
  *last = theString[(n-1)];
}

Мне нужна функция для сортировки любой введенной строки и возврата значений в основную с использованием массивов и указателей.

Что такое doubleme? Что такое swap? Почему вы передаете char на printf вместо %s? Я предполагаю, что последнее вызывает проблему, используйте %c, чтобы напечатать char.

Blaze 10.04.2019 15:56

doubleme и swap - это другие функции, которые нужно было использовать для этого задания, они работают нормально, я мог бы опубликовать их, если вы тоже хотите их увидеть. До сих пор в классе нам только показывали, как читать строку с помощью scanf. Если есть лучший способ, я открыт для обучения. Я печатаю оператор, потому что тестировал то же самое слово «блин», чтобы увидеть, смогу ли я получить желаемые результаты. Я считаю, что массив передается правильно, потому что я получаю «a» при печати строки [4].

Christian Heaven 10.04.2019 15:59

@ChristianHeaven Не думайте, что проблема не в определенных местах. Не редкость, что проблема в коде, который не опубликован.

klutt 10.04.2019 16:00

Вы всегда должны включать предупреждения компилятора. Это должно дать вам некоторые диагностические данные о несоответствии спецификаторов формата предоставленным параметрам.

Gerhardh 10.04.2019 16:03

Вы определенно должны использовать IDE с включенными предупреждениями компилятора. Это остановило бы сбой вашего кода. Мне было бы полезно, если бы вы включили весь код doubleme(), swap(), чтобы я мог запустить его через отладчик.

rustyMagnet 10.04.2019 16:05

Спасибо @Blaze, это то, что было не так все время. Я потратил три часа на просмотр этого кода и даже не подумал взглянуть на оператор печати в main.

Christian Heaven 10.04.2019 16:09

Запуск вашей программы в отладчике должен выявить место сбоя в течение нескольких секунд. Использование отладчика — это шаг, который вы должны включить в свой процесс для устранения ошибок.

Gerhardh 10.04.2019 16:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы обманываете свой компилятор. Вы утверждаете, что предоставляете адрес строки, но вместо этого передаете один символ для спецификатора формата %s.

  char beginning, ending;

  printf("%s is the first character and %s is the last.\n", beginning, ending);

Это будет рассматривать значение этого символа как адрес и пытаться читать оттуда. Это неопределенное поведение

Другие вопросы по теме