我需要一个递归代码的想法,该代码可删除字符串中的特定字符,并将所有其他字符串一起移动
例如:
“天气多云”
输入的字符为'e':
结果:
“云雾笼罩”
我真的不知道如何开始,谢谢您的帮助。
答案 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_impl
。 s
是原始字符串,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", ¬Allowed);
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;
}
要避免使用移动环路字符。我只是向前移动字符,在字符串的开头创建了空白空间。新闻指针是一样的字符串的新指针,以消除空/垃圾字符串。
答案 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;
}
两者都要求字符串是可写的(例如,您不能将指针传递给字符串文字)