如何从C中的string中删除给定索引的字符?
如何从string中删除字符?
如果我有string"abcdef"
,我想删除"b"
,我该怎么做?
使用此代码删除第一个字符很简单:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char word[] = "abcdef"; char word2[10]; strcpy(word2,&word[1]); printf("%s\n", word2); return 0; }
和
strncpy(word2,word,strlen(word)-1);
会给我没有最后一个字符的string,但我仍然不知道如何删除string中间的字符。
Memmove可以处理重叠区域,我会尝试类似的东西(未testing,也许+ -1的问题)
char word[] = "abcdef"; int idxToDel = 2; memmove(&word[idxToDel], &word[idxToDel + 1], strlen(word) - idxToDel);
之前:“abcdef”
之后:“abdef”
尝试这个 :
void removeChar(char *str, char garbage) { char *src, *dst; for (src = dst = str; *src != '\0'; src++) { *dst = *src; if (*dst != garbage) dst++; } *dst = '\0'; }
testing程序:
int main(void) { char* str = malloc(strlen("abcdef")+1); strcpy(str, "abcdef"); removeChar(str, 'b'); printf("%s", str); free(str); return 0; }
结果:
>>acdef
int chartoremove = 1; strncpy(word2,word,chartoremove); strncpy(((char*)word2)+chartoremove,((char*)word)+chartoremove+1,strlen(word)-1-chartoremove);
丑陋地狱
我的方式来删除所有指定的字符:
void RemoveChars(char *s, char c) { int writer = 0, reader = 0; while (s[reader]) { if (s[reader]!=c) { s[writer++] = s[reader]; } reader++; } s[writer]=0; }
下面将通过从第一个string参数中删除第二个string参数中出现的任何字符来扩展问题。
/* * delete one character from a string */ static void _strdelchr( char *s, size_t i, size_t *a, size_t *b) { size_t j; if( *a == *b) *a = i - 1; else for( j = *b + 1; j < i; j++) s[++(*a)] = s[j]; *b = i; } /* * delete all occurrences of characters in search from s * returns nr. of deleted characters */ size_t strdelstr( char *s, const char *search) { size_t l = strlen(s); size_t n = strlen(search); size_t i; size_t a = 0; size_t b = 0; for( i = 0; i < l; i++) if( memchr( search, s[i], n)) _strdelchr( s, i, &a, &b); _strdelchr( s, l, &a, &b); s[++a] = '\0'; return l - a; }
此代码将删除您从stringinput的所有字符
#include <stdio.h> #include <string.h> #define SIZE 1000 char *erase_c(char *p, int ch) { char *ptr; while (ptr = strchr(p, ch)) strcpy(ptr, ptr + 1); return p; } int main() { char str[SIZE]; int ch; printf("Enter a string\n"); gets(str); printf("Enter the character to delete\n"); ch = getchar(); erase_c(str, ch); puts(str); return 0; }
input
a man, a plan, a canal Panama
产量
A mn, pln, cnl, Pnm!
编辑:根据库的最新版本更新代码zstring_remove_chr()
。
从一个名为zString的BSD许可string处理库
https://github.com/fnoyanisi/zString
删除一个字符的function
int zstring_search_chr(char *token,char s){ if (!token || s=='\0') return 0; for (;*token; token++) if (*token == s) return 1; return 0; } char *zstring_remove_chr(char *str,const char *bad) { char *src = str , *dst = str; /* validate input */ if (!(str && bad)) return NULL; while(*src) if(zstring_search_chr(bad,*src)) src++; else *dst++ = *src++; /* assign first, then incement */ *dst='\0'; return str; }
例如用法
char s[]="this is a trial string to test the function."; char *d=" ."; printf("%s\n",zstring_remove_chr(s,d));
示例输出
thisisatrialstringtotestthefunction
#include <stdio.h> #include <string.h> int main(){ char ch[15],ch1[15]; int i; gets(ch); // the original string for (i=0;i<strlen(ch);i++){ while (ch[i]==ch[i+1]){ strncpy(ch1,ch,i+1); //ch1 contains all the characters up to and including x ch1[i]='\0'; //removing x from ch1 strcpy(ch,&ch[i+1]); //(shrinking ch) removing all the characters up to and including x from ch strcat(ch1,ch); //rejoining both parts strcpy(ch,ch1); //just wanna stay classy } } puts(ch); }
假设x是要移除的字符的“符号”,我的想法是将string分成两部分:
第一部分将统计所有从索引0到(包括)目标字符x的字符。
第二部分是所有x之后的字符(不包括x)
现在你所要做的就是重新join这两个部分。
char a[]="string"; int toBeRemoved=2; memmove(&a[toBeRemoved],&a[toBeRemoved+1],strlen(a)-toBeRemoved); puts(a);
尝试这个 。 memmove会重叠。 testing。
使用strcat()
来连接string。
但strcat()
不允许重叠,所以你需要创build一个新的string来保存输出。
以下应该做到这一点:
#include <stdio.h> #include <string.h> int main (int argc, char const* argv[]) { char word[] = "abcde"; int i; int len = strlen(word); int rem = 1; /* remove rem'th char from word */ for (i = rem; i < len - 1; i++) word[i] = word[i + 1]; if(i < len) word[i] = '\0'; printf("%s\n", word); return 0; }
我尝试了strncpy()
和snprintf()
。
int ridx = 1; strncpy(word2,word,ridx); snprintf(word2+ridx,10-ridx,"%s",&word[ridx+1]);
另一个解决scheme,使用memmove()以及index()和sizeof():
char buf[100] = "abcdef"; char remove = 'b'; char* c; if ((c = index(buf, remove)) != NULL) { size_t len_left = sizeof(buf) - (c+1-buf); memmove(c, c+1, len_left); }
buf []现在包含“acdef”
这可能是最快的一个,如果你通过索引:
void removeChar(char *str, unsigned int index) { char *src; for (src = str+index; *src != '\0'; *src = *(src+1),++src) ; *src = '\0'; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 50 void dele_char(char s[],char ch) { int i,j; for(i=0;s[i]!='\0';i++) { if(s[i]==ch) { for(j=i;s[j]!='\0';j++) s[j]=s[j+1]; i--; } } } int main() { char s[MAX],ch; printf("Enter the string\n"); gets(s); printf("Enter The char to be deleted\n"); scanf("%c",&ch); dele_char(s,ch); printf("After Deletion:= %s\n",s); return 0; }
这是你可能要找的,而计数器是指数。
#include <stdio.h> int main(){ char str[20]; int i,counter; gets(str); scanf("%d", &counter); for (i= counter+1; str[i]!='\0'; i++){ str[i-1]=str[i]; } str[i-1]=0; puts(str); return 0; }
这是我如何在c ++中实现相同的。
#include <iostream> #include <cstring> using namespace std; int leng; char ch; string str, cpy; int main() { cout << "Enter a string: "; getline(cin, str); leng = str.length(); cout << endl << "Enter the character to delete: "; cin >> ch; for (int i=0; i<leng; i++) { if (str[i] != ch) cpy += str[i]; } cout << endl << "String after removal: " << cpy; return 0; }
摆脱\ 0的一个方便,简单和快速的方法是在strncpy而不是strcpy的帮助下复制没有最后一个char(\ 0)的string:
strncpy(newStrg,oldStrg,(strlen(oldStrg)-1));