Добавление общих символов в две строки в новую строку - PullRequest
0 голосов
/ 26 апреля 2020

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

char *common(char *a, char *b){
    char *result = "";
       for (int i = 0; i < strlen(a); i++){
        for (int j = 0; j < strlen(b); j++){
            if (a[i] == b[j]){
                printf("%c", a[i]);
            }
            }
        }
    return result;
    }

Она должна сравнить две заданные строки и дать новую строку с общими символами этих строк обратно. Например, строки: hello world и спасибо вернут строку ho .

На данный момент он просто печатает символы и результат пуст, потому что у меня проблема с получением символов в строке result . Как я могу это сделать в этом случае?

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

Ответы [ 3 ]

0 голосов
/ 26 апреля 2020

Для начала вам нужно иметь массив char для хранения общих символов. Затем вам нужно сохранить их в соответствии с порядком их появления, а также доказать, был ли символ уже присвоен массиву. После того, как l oop полностью заработал, вы должны присвоить нулевой символ \0 в следующем элементе, чтобы указать конец строки. Кроме того, вы должны передать дополнительным параметрам указатель на массив char в вызывающей стороне, где хранится строка с общими символами, и другой параметр с размером этого массива в качестве его размера не может быть определен внутри функции:

char *common(char *a, char *b, char *c, size_t len){

    int k = 0;

    for (int i = 0; i < strlen(a); i++){
        for (int j = 0; j < strlen(b); j++){
            if (a[i] == b[j]){
                printf("%c", a[i]);

                for(size_t i = 0; i < size; i++) {  
                   if(c[i] == a[i])
                   {
                      continue;
                   }
                }

                if(i < len)
                {
                   c[k] = a[i];
                }
                else if( i > len )
                {
                   return NULL;
                }

                k++
            }
        }
    }

    x[k] = '\0';    

    return c;
}
0 голосов
/ 26 апреля 2020

Не могу дать вам весь код, но может помочь вам с другим подходом. Простым способом было бы создать новую строковую переменную (например, результат), в которой вы сохранили бы обычные символы, как вы это делали (вы можете сделать это динамически или с длиной самой длинной строки между двумя имеющимися у вас), чем вы go через каждый элемент в одна строка с l oop, чем проверять с помощью функции strchr () из string.h, если символ находится в другой строке, если он находится в другой строке, снова проверять, есть ли он в результате, если он не просто объединяет его с результатом strcat () , Я пытался объяснить это так четко, как только мог. Надеюсь, это поможет:)

0 голосов
/ 26 апреля 2020

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

#include<stdio.h>


int isCharExist(char *str, char c){
 int i=0;
 while(str[i] != NULL){
  if(str[i] == c){
    return 1;
  }
  i++;
 }
 return 0;
}
char *common(char *a, char *b){
    char *result = "";
    int index = 0,i,j;
       for (i = 0; i < strlen(a); i++){
    for ( j = 0; j < strlen(b); j++){
        if (a[i] == b[j]){
        if(!isCharExist(result, a[i])){
         result[index++] = a[i];
         result[index] = '\0';//last character of string is always NULL

        }
        }
        }
    }

    return result;
}

void main(){
  char *result = "",*str1,*str2;
  //better to assign space before assignment
  str1 = "hello world";
  str2 = "thank you";
  //clrscr();
  result = common(str1,str2);
  printf("%s",result);

}

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

#include<stdio.h>
int isCharExist(char *result, char c);
char *common(char *a, char *b);

int isCharExist(char *result, char c){
//this function help you to find that current character
//is in your result or not
 int i=0;
 while(result[i] != NULL){
  if(result[i] == c){
    //if it find character in result string it return 1
    return 1;
  }
  i++;
 }
 return 0;//if not find then it return 0
}

char *common(char *a, char *b){
    char *result = "";
    int index = 0,i,j;

    //it is good to keep length in seprate variable before loop
    //in loop it calculate length each time
    int len1 =  strlen(a);
    int len2 =  strlen(b);
       for (i = 0; i < len1; i++){
    for ( j = 0; j < len2; j++){

    //check equality but not for blank
        if (a[i] == b[j] && a[i] != ' '){
        if(!isCharExist(result, a[i]))
        {
         result[index++] = a[i];
         result[index] = '\0';//last character of string is always NULL

        }
        }
        }
    }

    return result;
}

void main(){
  char *result = "",*str1,*str2;
  //better to assign space before assignment
  str1 = "hello world";
  str2 = "thank you";
  //clrscr();
  result = common(str1,str2);
  printf("%s",result);

}

Выше приведено лишь несколько изменений в вашей функции, поэтому просто замените вашу функцию не полным кодом.

char *common(char *a, char *b){
    char *result = "";
    int index = 0,i,j,k, isDuplicate=0;

    //it is good to keep length in seprate variable before loop
    //in loop it calculate length each time
    int len1 =  strlen(a);
    int len2 =  strlen(b);
       for (i = 0; i < len1; i++){
    for ( j = 0; j < len2; j++){

    //check equality but not for blank
        if (a[i] == b[j] && a[i] != ' '){
        k = 0;
        while(result[k] != '\0'){
            if(a[i] == result[k]){
              isDuplicate = 1;
              break;
            }
            k++;
        }
        if(!isDuplicate)
        {
         result[index++] = a[i];
         result[index] = '\0';//last character of string is always NULL

        }
        isDuplicate = 0;
        }
        }
    }

    return result;
}
...