Cの文字列から特定のインデックスの文字を削除する方法は?

c string
Cの文字列から特定のインデックスの文字を削除する方法は?

文字列から文字を削除するにはどうすればよいですか?

文字列 `” abcdef “`があり、 `” b “`を削除したい場合、どうすればよいですか?

このコードを使用すると、*最初の*文字を簡単に削除できます。

#include
#include
#include

int main()
{
   char word[] = "abcdef";
   char word2[10];

   strcpy(word2,&word[1]);

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

   return 0;
}

and

strncpy(word2,word,strlen(word)-1);

*最後の*文字なしで文字列を教えてくれますが、文字列の*中間*の文字を削除する方法はまだわかりませんでした。

  44  11


ベストアンサー

https://www.tutorialspoint.com/c_standard_library/c_function_memmove.htm [memmove]は重複領域を処理できます。そのようなことを試してみます(テストされていないか、おそらく-1の問題)

char word[] = "abcdef";
int idxToDel = 2;
memmove(&word[idxToDel], &word[idxToDel + 1], strlen(word) - idxToDel);

前: " abcdef "

後: " abdef "

56


これを試して :

void removeChar(char *str, char garbage) {

    char *src, *dst;
    for (src = dst = str; *src != '\0'; src++) {
        *dst = *src;
        if (*dst != garbage) dst++;
    }
    *dst = '\0';
}

テストプログラム

int main(void) {
    char* str = malloc(strlen("abcdef")+1);
    strcpy(str, "abcdef");
    removeChar(str, 'b');
    printf("%s", str);
    free(str);
    return 0;
}

結果:

>>acdef

36


指定されたすべての文字を削除する私の方法:

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

9


char a[]="string";
int toBeRemoved=2;
memmove(&a[toBeRemoved],&a[toBeRemoved+1],strlen(a)-toBeRemoved);
puts(a);

これを試して 。 * memmove *はオーバーラップします。 テスト済み

5


int chartoremove = 1;
strncpy(word2,word,chartoremove);
strncpy(((char*)word2)+chartoremove,((char*)word)+chartoremove+1,strlen(word)-1-chartoremove);

地獄のようなUい

4


これが以前に投稿されていないことに本当に驚いた。

strcpy(&str[idx_to_delete], &str[idx_to_delete + 1]);

非常に効率的でシンプル。 strcpy`はほとんどの実装で memmove`を使用します。

3


以下は、最初の文字列引数から2番目の文字列引数で発生する文字を削除することにより、問題を少し拡張します。

/*
 * 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;
}

2


#include
#include

int main(){
    char ch[15],ch1[15];
    int i;
    gets(ch);  // the original string
    for (i=0;i

xが削除したい文字の「シンボル」であると仮定しましょう。私の考えは、文字列を2つの部分に分割することでした:

最初の部分は、インデックス0からターゲット文字xまで(を含む)すべての文字をカウントします。

2番目の部分は、xの後のすべての文字をカウントします(xを含まない)

あとは、両方の部分を再結合するだけです。

1


*編集:*ライブラリの最新バージョンに従って、コード `zstring_remove_chr()`を更新しました。

zStringと呼ばれる、BSDライセンスのC用文字列処理ライブラリから

文字を削除する機能

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

1


このコードは、文字列から入力したすべての文字を削除します

#include
#include

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

入力

a man, a plan, a canal Panama

出力

 A mn,  pln,  cnl, Pnm!

1


タイトルとURLをコピーしました