本文介绍了挣扎着弦乐的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 大家好! 我正在尝试学习C编程,但我的java背景会阻止我的 大脑。 我有一本书很多功能,其中一些不能正常工作,所以我有机会通过校正在C中锻炼 (奇怪,是吧?)。 /> 例如,我想编写一个函数,从字符串中删除给定子串的所有出现的 。 到目前为止我有两个函数: 1.从字符串中删除第一个子字符串(我在这本可怕的书中对函数进行了更正之后做了一遍: char * strstr_rem_first(char * string,char * substring){ int i,j,k,loc = -1; for(i = 0; string [i]&&(loc == - 1); i ++){ for(j = i,k = 0; string [j] == substring [k]; j ++,k ++) if(!substring [k + 1]) loc = i; if (loc!= -1){//找到子串 for(k = 0; substring [k]; k ++); { for(j = loc,i = loc + k;串[I]; j ++,i ++){ string [j] = string [i]; string [i] =''\'''; } } } } 返回(字符串); } 2.找到子串的最右边索引(如果找不到则返回-1): int substring_index(const char * string,const char * substring){ int i,j,k; for(i = 0; string [i]; i ++) for(j = i,k = 0; string [j] == substring [k]; j ++,k ++) if(!substring [k + 1]) 返回(i); 返回(-1); } 现在,武装这些我想构建删除所有 子串的函数。 我虽然有类似这样的事情: while(substring_index()> 0) string_original变为substring_rem_first 返回string_original 不幸的是,因为字符串被视为数组,我不能将转移引用作为e我已经习惯了,我无法弄清楚如何在C中完成它。 我拖着一些指针和一些strcpy()等徒劳无功。 特别是这个''string_original变成substring_rem_first''困扰 我。 我总是以''undefined''引用''结束'' substring_rem_first''。 你能救我吗? :-)Hi guys!I am trying to learn C programming but my java background blocks mybrains.I have a book with a lot of functions and some of them don''t workcorrectly, so I have opportunity to exercise in C by correction(strange, huh?).For example, i want to write function that removes all occurences ofgiven substring from string.I have two functions so far:1. removes first substring from the string (i made it aftercorrections of the function that i had in the horrible book:char *strstr_rem_first(char *string, char *substring) {int i, j, k, loc=-1;for(i=0; string[i] && (loc==-1); i++) {for(j=i, k=0; string[j] ==substring[k];j++, k++)if(!substring[k+1])loc=i;if(loc != -1) { //substring was foundfor(k=0; substring[k];k++); {for(j=loc, i=loc+k; string[i]; j++, i++) {string[j] = string[i];string[i]=''\0'';}}}}return (string);}2. finds rightmost index of the substring (returns -1 if not found):int substring_index(const char *string, const char *substring) {int i, j, k;for(i=0; string[i];i++)for(j=i,k=0; string[j] == substring[k]; j++, k++)if(!substring[k+1])return(i);return(-1);}Now, armed with these I wanted to construct function that removes allsubstrings.I though about somthing like this:while(substring_index() > 0)string_original becomes substring_rem_firstreturn string_originalUnfortunately, because strings are treated as arrays and i can''ttransfer references as easily as i got used to, i can''t figure out howto accomplish it in C.I shuffled some pointers and some strcpy() etc in vain.Especially this ''string_original becomes substring_rem_first'' bothersme.I always end up with ''undefined'' reference to ''substring_rem_first''.Could you help me out? :-)推荐答案 查看在string.h中声明的函数。:-) 这里是删除所有substring的函数。来自string: #include< string.h> char * strstr_rem_all(char * string,const char * substring ){ char *发生; int substr_len = strlen(substring); int move_len = strlen(string) - substr_len + 1; / * +1 b / c终止''\ 0''* / while(occurrence = strstr(字符串,子串)){ memmove(发生, string + substr_len,move_len); } 返回字符串; } memmove( )用来代替memcpy(),因为它处理重叠的 副本。 :-) 我希望有所帮助! :-) 问候, Ekkehard Morgenstern。Check out the functions declared in "string.h". :-)Here''s a function to remove all occurrences of "substring" from "string":#include <string.h>char* strstr_rem_all( char* string, const char* substring ) {char* occurrence; int substr_len = strlen( substring ); int move_len =strlen( string ) - substr_len + 1; /* +1 b/c of terminating ''\0'' */while ( occurrence = strstr( string, substring ) ) {memmove( occurrence, string + substr_len, move_len );}return string;}memmove() is used instead of memcpy(), because it handles overlappingcopies. :-)I hope that helps! :-)Regards,Ekkehard Morgenstern. 查看在string.h中声明的函数。:-) 这是一个删除所有出现的函数的函数"子"来自string: #include< string.h> char * strstr_rem_all(char * string,const char * substring){ char *发生; int substr_len = strlen(substring); int move_len = strlen(string) - substr_len + 1; / * +1 b / c终止''\ 0''* / while(occurrence = strstr(字符串,子串)){ memmove(occurrence,字符串+ substr_len,move_len); } 返回字符串; 使用memmove()代替memcpy(),因为它处理重叠的副本。 :-) 我希望有所帮助! :-) 问候, Ekkehard Morgenstern。 Check out the functions declared in "string.h". :-) Here''s a function to remove all occurrences of "substring" from "string": #include <string.h> char* strstr_rem_all( char* string, const char* substring ) { char* occurrence; int substr_len = strlen( substring ); int move_len = strlen( string ) - substr_len + 1; /* +1 b/c of terminating ''\0'' */ while ( occurrence = strstr( string, substring ) ) { memmove( occurrence, string + substr_len, move_len ); } return string; } memmove() is used instead of memcpy(), because it handles overlapping copies. :-) I hope that helps! :-) Regards, Ekkehard Morgenstern. 这里有点奇怪。 小心你要动多少......最初的长度 字符串 - 子串+1的长度。这不会在 循环内部发生变化,但每次字符串变短时都会发生变化。 这个怎么样?它应该工作。 char * strstr_rem_all(char * string,const char * substring){ char * occurrence; int substr_len = strlen(substring); int move_len; while(occurrence = strstr(string,substring)){ move_len = strlen (发生) - substr_len + 1; memmove(发生,发生+ substr_len,move_len); } 返回字符串; } 我希望有所帮助! :-) 问候, Ekkehard Morgenstern。Isn''t there something a bit weird here.Be careful abt how much you are moving ... the length of the initialstring - that of the substring +1 . This does not change inside theloop but each time the string gets shorter.What about this ? It should work.char* strstr_rem_all( char* string, const char* substring ) {char* occurrence;int substr_len = strlen( substring );int move_len;while ( occurrence = strstr( string, substring ) ) {move_len = strlen( occurrence ) - substr_len + 1;memmove( occurrence, occurrence + substr_len, move_len );}return string;} I hope that helps! :-) Regards, Ekkehard Morgenstern. 这篇关于挣扎着弦乐的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!