2016-11-10 30 views
1

配列の最初の3文字をライブラリなしで削除する必要があります。これをどうやってやりますか?私はmemmoveを使用できることを知っていますが、私は標準ライブラリなしのシステムで作業しています。memmoveはポインタ用です。文字列の最初の数文字を削除します

void chopN(char *str, size_t n) 
{ 
    assert(n != 0 && str != 0); 
    size_t len = strlen(str); 
    if (n > len) 
     return; // Or: n = len; 
    memmove(str, str+n, len - n + 1); 
} 

をしかし、私はmemmoveまたは任意の他の標準ライブラリ関数なしで配列から文字を削除できます。memmoveで、私はthisを行うことができますか?

+0

「削除」するとメモリを解放しますか?もし出力されていなければ、ポインタは新しい開始点を指しています。つまり、str + = 3です。 –

+1

@Ur Mom strlenを使用できますか? –

+0

注: 'assert(n!= 0 && str!= 0)'に 'n!= 0'を書く必要はありません。 – chux

答えて

2

文字列の長さが3文字以上であれば、str + 3を使用できます。あなたは「\ 0」を検索することができ、パラメータとして文字の「量」を渡す必要はありません

+1

元のポインタを保存せず、後でそのポインタを 'フリーズする必要がある場合には危険です。それはスタックにある場合でも問題はありません。 – Cody

+1

@Cody確かに、あなたはCで自分を傷つける1000の方法を考え出すことができます。厳密に言えば、OPが尋ねたことを達成するための最良の方法です。 –

0

void chopN(char *str, size_t n){ 
    char *aux; 
    int i=0,j=0; 
    while(str[i]!='\0'){ 
     if(i>n+1){ 
      aux[j++]=str[i++]; 
     }else i++; 
    } 
    aux[j]='\0'; 
    str = aux; 
} 
1

ここでは、標準のC文字列関数を使用していない機能です。 nは、strlen(s)以下にすることができます。それ以外の場合、関数は何もしません。あなたはケースにnを超えるstrlen(s)すべての文字が削除されたときにことをしたい場合

#include <stdio.h> 

char * chopN(char *s, size_t n) 
{ 
    char *src = s; 

    while (*src && n) --n, ++src; 

    if (n == 0 && src != s) 
    { 
     for (char *dst = s; ( *dst++ = *src++);); 
    } 

    return s; 
} 

int main(void) 
{ 
    char s[] = "Hello, World"; 

    puts(s); 
    puts(chopN(s, 7)); 

    return 0; 
} 

プログラムの出力は、それがに十分である

Hello, World 
World 

あるif文

if (n == 0 && src != s) 

を置換この1人用

if (src != s) 
0

単に新たなスタート(STR + N)で起動し、文字列の最後に到達するまで、charで古い開始文字をコピーします。

char *str1; 
for(str1 = str+n; *str1; *str++=*str1++) 
    ; 
*str = 0; 

あなたはより強力な何かをしたい場合は、することができます例えば、 http://git.musl-libc.org/cgit/musl/tree/src/string/memmove.cからmemmoveの実装を盗みます(いくつかのパフォーマンスの調整と移動の進行方向(左/右)の決定を除いて、基本的に同じことをします)。

2

Hmmm:2単純なwhileループで行う必要があります。

あなたにアイデアを与えるためのいくつかのテストされていないコード。

void chopN(char *str, size_t n) { 
    char *dest = str; 

    // find beginning watching out for rump `str` 
    while (*str && n--) { 
    str++; 
    } 

    // Copy byte by byte 
    while (*src) { 
    *dest++ = *src++; 
    } 

    *dest = '\0'; 
} 

ショートカットを追加することもできます。

関連する問題