将两个字符串中的公共字符添加到新字符串中

时间:2020-04-26 17:14:06

标签: c string character

我用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

目前,它只打印字符,结果为空,因为在结果字符串中获取字符存在问题。在这种情况下我该怎么办?

加上结果字符串不应包含重复的字符,而每个字母只能包含一次。我也不知道该怎么做,但这不是主要问题。

3 个答案:

答案 0 :(得分:0)

我希望它会对您有所帮助,它是一个有效的代码。我只是对您的程序进行了很小的更改,并添加了所需的内容。很快我将对此进行优化。但是首先请通过下面的代码来了解概念。

#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;
}

答案 1 :(得分:0)

首先,您需要一个char数组来存储公共字符。然后,您需要在它们出现的顺序之后存储它们,还要证明是否已将字符分配给数组。循环完全结束之后,您必须在以下元素中分配\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;
}

答案 2 :(得分:0)

无法提供完整的代码,但可以帮助您使用另一种方法。一种简单的方法是制作新的字符串变量(例如结果),与在一个字符串中的每个元素进行遍历一样,在该变量中您可以像以前那样保存公共字符(可以动态使其变长,或者最长字符串的大小可以在2个字符之间)。使用循环,然后从string.h中使用strchr()函数进行检查,如果字符在另一个字符串中,如果在另一个字符串中,则再次检查结果是否存在,是否不仅仅是将其与strcat()连接起来。我试图尽我所能解释清楚。希望能有所帮助:)

相关问题