【问题标题】:Adding common characters in two strings into a new string将两个字符串中的常用字符添加到新字符串中
【发布时间】:2020-04-26 17:14:06
【问题描述】:

我用 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 worldthank you 将返回字符串 ho

现在它只打印字符,结果为空,因为我在获取 result 字符串中的字符时遇到问题。在这种情况下我该怎么做?

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

【问题讨论】:

  • 取一个字符指针或字符数组来保存常用字符,保存前检查是否存在。
  • 在结果中赋值而不是打印并在赋值前检查重复项
  • 案件呢??小写字母和大写字母?? H 和 h 是相同的还是不同的?
  • 它应该是唯一的字符,所以结果中可以有H和h。我不知道如何在结果中分配值,就是这样。另外我不知道如何检查重复项。
  • 好吧意味着 h 和 H 对于你的情况来说是不同的字符???

标签: c string character


【解决方案1】:

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

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

【讨论】:

  • 这个供大家理解,怎么赋值等等。
  • 由于某种原因我收到一个错误:'isExist' 的类型冲突
  • 在使用前声明您声明“char *common(char *a, char *b)”的位置或将 isExist 函数保留在“char *common(char *a, char *b)”函数之上。
  • 如果仍然出现错误,请更改函数名称。
  • 我不知道是什么问题,但即使我将您的更好的代码全部复制并运行它,由于 clrscr(),我得到编译器退出状态 1。但是当我删除它时,控制台会在我运行它时等待一段时间,然后结束而不打印任何内容。
【解决方案2】:

无法为您提供完整的代码,但可以通过另一种方法帮助您。简单的方法是创建新的字符串变量(例如结果),您可以像以前一样保存常用字符(您可以动态创建它或使用最长字符串的大小在 2 之间),而不是遍历一个字符串中的每个元素使用循环,而不是使用 string.h 中的 strchr() 函数检查字符是否在另一个字符串中,如果它在另一个字符串中,再次检查它是否在结果中,如果它不只是将它连接到 strcat() 中。我试图尽可能清楚地解释它。希望对你有帮助:)

【讨论】:

    【解决方案3】:

    首先,您需要有一个 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;
    }
    

    【讨论】:

    • 我不同意静态部分。这是一个典型示例,您希望调用者提供缓冲区和缓冲区长度,并使用它。在函数外使用静态内存是不好的做法。
    • @Cheatah 所以,我终于改变了答案。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多