Мне нужно создать программу, которая сортирует одно слово по алфавиту, и это нужно сделать с помощью массивов и указателей.
Я попытался удалить размер массива и выделить память, но это дало мне ту же ошибку сегментации. Я не знаю, связана ли проблема с передачей массива в функцию или пузырьковой сортировкой. Я добавил оператор печати в функцию, поэтому предполагаю, что правильно передаю массив. Когда вводится блин, он печатает внутри функции. Я больше склоняюсь к пузырьковой сортировке, вызывающей проблему, потому что я могу удалить ее, и это избавит от ошибки сегментации.
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 - это другие функции, которые нужно было использовать для этого задания, они работают нормально, я мог бы опубликовать их, если вы тоже хотите их увидеть. До сих пор в классе нам только показывали, как читать строку с помощью scanf. Если есть лучший способ, я открыт для обучения. Я печатаю оператор, потому что тестировал то же самое слово «блин», чтобы увидеть, смогу ли я получить желаемые результаты. Я считаю, что массив передается правильно, потому что я получаю «a» при печати строки [4].
@ChristianHeaven Не думайте, что проблема не в определенных местах. Не редкость, что проблема в коде, который не опубликован.
Вы всегда должны включать предупреждения компилятора. Это должно дать вам некоторые диагностические данные о несоответствии спецификаторов формата предоставленным параметрам.
Вы определенно должны использовать IDE с включенными предупреждениями компилятора. Это остановило бы сбой вашего кода. Мне было бы полезно, если бы вы включили весь код doubleme(), swap(), чтобы я мог запустить его через отладчик.
Спасибо @Blaze, это то, что было не так все время. Я потратил три часа на просмотр этого кода и даже не подумал взглянуть на оператор печати в main.
Запуск вашей программы в отладчике должен выявить место сбоя в течение нескольких секунд. Использование отладчика — это шаг, который вы должны включить в свой процесс для устранения ошибок.





Вы обманываете свой компилятор.
Вы утверждаете, что предоставляете адрес строки, но вместо этого передаете один символ для спецификатора формата %s.
char beginning, ending;
printf("%s is the first character and %s is the last.\n", beginning, ending);
Это будет рассматривать значение этого символа как адрес и пытаться читать оттуда. Это неопределенное поведение
Что такое
doubleme? Что такоеswap? Почему вы передаетеcharнаprintfвместо%s? Я предполагаю, что последнее вызывает проблему, используйте%c, чтобы напечататьchar.