Перестановка строки

#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) . Т.е. в прототипе указано, что первый параметр является a char однако фактическая функция указывает, что первый параметр является a pointer 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[])