#c #string #permutation
#c #строка #перестановка
Вопрос:
Я пытаюсь реализовать код, в котором я должен переставлять строку.Всякий раз, когда я пытаюсь выполнить свой код, я получаю следующие ошибки и предупреждения;
1. передача аргумента 1 перестановки создает целое число из указателя без приведения
2. ожидаемый символ, но аргумент имеет тип char *
3. конфликтующий тип для перестановки
что может вызвать эти ошибки в моей программе?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void swap(char *first,char *second);
void permute(char a,int l,int r);
int main(){
char str[] = "ABC";
int size = strlen(str);
permute(str,0,size-1);
return 0;
}
void permute(char *a,int l,int r){
if (l==r){
printf("%sn",a);
}else{
int i;
for(i=l;i<=r;i ){
swap((a l),(a i));
permute(a,l 1,r);
swap((a l),(a i));
}
}
}
void swap(char *first,char *second){
char *temp;
*temp = *first;
*first = *second;
*second = *temp;
}
Комментарии:
1. я изменил это,,,,, но программа по-прежнему не работает
2. Разве это не то, что вы хотите для подкачки? пустой обмен (char *first,char *second){ char temp; temp = *first; *first = *second; *second = temp; }
3. Вы должны отлаживать каждую из ваших функций одну за другой. Strlen уже возвращает только количество символов. что было бы 3 для «ABC», передача размера-1 уже неверна. Были бы и другие проблемы, протестируйте свою функцию подкачки отдельно, как уже было предложено
4. среди других проблем с кодом этот прототип:
void permute(char a,int l,int r);
не соответствует фактической сигнатуре функции:void permute(char *a,int l,int r)
. Т.е. в прототипе указано, что первый параметр является achar
однако фактическая функция указывает, что первый параметр является apointer to char
5. имена переменных и параметров должны указывать на содержимое или использование (или, лучше, на оба варианта). Имена:
a
,l
,r
не имеют смысла даже в текущем контексте.
Ответ №1:
В прототипе вашей функции ошибка. Это объявлено следующим образом:
void permute(char a,int l,int r);
Но определяется так:
void permute(char *a,int l,int r) {
Обратите внимание, что тип первого аргумента не совпадает. Вам нужно изменить прототип, чтобы он соответствовал определению.
Не связанная с этим, ваша swap
функция использует указатель temp
, который разыменовывается без установки. Это неопределенное поведение и, скорее всего, приведет к дампу ядра.
Поскольку вы меняете местами символы здесь, вам нужно только char
, а не char *
.
void swap(char *first,char *second){
char temp;
temp = *first;
*first = *second;
*second = temp;
}
Комментарии:
1. код перестает работать без каких-либо предупреждений или ошибок сейчас:(
2. Это потому, что ваша длина строки короче. Strlen уже возвращает 3 для ABC, почему -1? Отладьте свой код, пожалуйста
Ответ №2:
Ваша ошибка заключается в том, что ваш тип данных — char для функции permute, где вы хотите, чтобы это был массив. Вы хотите использовать параметр char *a[]. Перестановка должна быть
void permute(char *a[], int l, int r)
Комментарии:
1. Хотя указанная ошибка верна, решение — нет. Либо ее символ *a, либо символ a[]. Но не может быть и того, и другого (в ответе изначально было написано char *a[]), т. Е. вы не передаете указатель на массив символов. Вы либо передаете указатель на символ (который является первым элементом) (char * a), либо адрес первого элемента массива (char a[])