删除字符并将其移动到字符串中

时间:2019-02-02 14:33:35

标签: c string recursion

我需要一个递归代码的想法,该代码可删除字符串中的特定字符,并将所有其他字符串一起移动

例如:

“天气多云”

输入的字符为'e':

结果:

“云雾笼罩”

我真的不知道如何开始,谢谢您的帮助。

7 个答案:

答案 0 :(得分:1)

#include <stdio.h>

void remove_impl(char* s, char c, char* d) {
    if (*s != c) {
        *d++ = *s;
    }
    if (*s != '\0') {
        remove_impl(++s, c, d);
    }
}

void remove(char* s, char c) {
    remove_impl(s, c, s);
}

int main() {
    char s[] = "the weather is cloudy";
    remove(s, 'e');
    puts(s);
}

它如何工作?考虑remove_impls是原始字符串,c是要从s中删除的字符,d是生成的字符串,s的字符不是该字符串等于c的字符被写入。递归地遍历s的字符。如果下一个字符不等于c,则将其写入d。递归停止点是检查s结束的条件。由于必须修改源字符串,因此实现了包装器(remove),其中传递了原始字符串(s)作为d。

答案 1 :(得分:0)

这可以通过多种方式完成。我现在正在考虑的是存储not Allowed char数组,该数组将过滤应该显示或不显示哪个字符。如下所示。

#include <stdio.h>
#include <string.h>

// Global Scope variable declaration
int notAllowedChar[128] = {0}; // 0 for allowed , 1 for not allowed
char inputString[100];


void recursion(int pos, int len) {

    if( pos >= len ) {
       printf("\n"); // new line
       return;
    }

    if( notAllowedChar[inputString[pos]]) {// not printing
       recursion( pos + 1 , len );
    }
    else {
       printf("%c", inputString[pos]);
       recursion( pos + 1 , len );
    }

}

int main() {

 gets(inputString);  // taking input String

    printf("Enter not allowed chars:: "); // here we can even run a loop for all of them
    char notAllowed;
    scanf("%c", &notAllowed);
    notAllowedChar[notAllowed] = 1;
    int len = strlen(inputString);
    recursion( 0 , len );

}

工作方式

让我们说一个简单的字符串“ Hello world” 并且我们希望从最终字符串中删除l,因此最终输出将为“ Heo word”

“ Hello world”的长度为11个字符 在调用递归函数之前,我们要确保{l}数组中的108个ascii值link 1为'l'索引。

现在我们正在调用具有(0,11)值的递归方法,在递归方法中,我们主要有2个逻辑if操作,第一个用于notAllowedChar,在pos等于或等于时将终止递归调用大于11,如果不正确,则base case是否可打印,我们将进行第二个逻辑运算。这只是检查此字符在current char列表中的位置而已。每次我们增加notAllowedChar值+ pos并进行递归调用时,最后当pos等于或大于11时,这意味着我们已经做出了所有关于打印char的决定,否则我们的递归是否会终止。我尝试为变量分配有意义的名称。如果您仍然不了解这项工作的方式,则应该使用简单的递归模拟基础(在youtube中搜索),并且还应该尝试手动调试1中值的变化方式。这可能需要一些时间,但值得理解。一切顺利。

答案 2 :(得分:0)

一种简单的方法是遍历字符串,并添加任何与不需要的字母不匹配的字母。

这是一个示范:

char *source = "the weather is cloudy";
int source_len = strlen(source);

char *target = (char *)calloc(source_len, sizeof(char));
int target_len = 0;

char to_remove = 'e';

for(int i = 0; i < source_len; i++)
{
    if(source[i] != to_remove)
    {
        target[target_len++] = source[i];
    }
}

puts(target); // Output "th wathr is cloudy" in the console

答案 3 :(得分:0)

轮到我求婚了!我添加了一个断言测试并使用现有功能(strchr和strcpy)。

Count

答案 4 :(得分:0)


#include <stdio.h>

/**
* Returns the number of removed chars.
* Base case: if the current char is the null char (end of the string)
* If the char should be deleted return 1 + no of chars removed in the remaining string.
* If it's a some other char simply return the number of chars removed in the remaining string
*/
int  removeCAfterwardsAndCount(char* s,char c){
  if((*s) == '\0'){
      return 0;
  }

  if((*s) == c){
     int noOfChars = removeCAfterwardsAndCount(s+1,c);// s+1 means the remaining string
      s[noOfChars] = *s; // move the current char (*s) noOfChars locations ahead

    return  noOfChars +1; // means this char is removed... some other char should be copied here...

  }
  else{
      int noOfChars  = removeCAfterwardsAndCount(s+1,c);
      s[noOfChars ] = *s;
    return  noOfChars ; // means this char is intact ... 
  }

}

int main()
{

    char s[] = "Arifullah Jan";
    printf("\n%s",s);
    int totalRemoved = removeCAfterwardsAndCount(s,'a');
    char *newS = &s[totalRemoved]; // the start of the string should now be originalPointer + total Number of chars removed

    printf("\n%s",newS);

    return 0;
}

Test Code Here

要避免使用移动环路字符。我只是向前移动字符,在字符串的开头创建了空白空间。新闻指针是一样的字符串的新指针,以消除空/垃圾字符串。

答案 5 :(得分:-1)

#include <stdio.h>

void RemoveChar(char* str, char chr) {
char *str_old = str;
char *str_new = str;

while (*str_old)
{
    *str_new = *str_old++;
    str_new += (*str_new != chr);
}

*str_new = '\0'; }

int main() {
char string[] = "the weather is cloudy";

RemoveChar(string, 'e');

printf("'%s'\n", string);

return 0; }

答案 6 :(得分:-1)

#include <stdio.h>
#include <string.h>

char *remove_char(char *str, int c)
{
    char *pos;
    char *wrk = str;
    while((pos = strchr(wrk, c)))
    {
        strcpy(pos, pos + 1);
        wrk = pos;
    }
    return str;
}

int main()
{
    char str[] = "Hello World";
    printf(remove_char(str, 'l'));

    return 0;
}

或更快速但模式难以理解的版本:

char *remove_char(char *str, int c)
{
    char *pos = str;
    char *wrk = str;
    while(*wrk)
    {
        if(*wrk == c)
        {
            *wrk++;
            continue;
        }
        *pos++ = *wrk++;
    }
    *pos = 0;
    return str;
}

两者都要求字符串是可写的(例如,您不能将指针传递给字符串文字)