2010-11-28 13 views
13

誰でもお手伝いできますか?最初の文字をCのchar *から削除する必要があります。C文字列から最初の文字を削除するには?

たとえば、char * contentsは、配列の最初の文字として'\n'文字を含んでいます。私は、この文字を検出して除去する必要があり、元の変数を「消毒」した後に変更します。

コードを教えてもらえますか?私はCにとって全く新しいので、それを理解するようには思えません。

+1

で、 'について読むことが非常に有益ですポインタ算術演算を行う。 Googleの言葉、あなたは多くのヒットを得るでしょう。これは、他の人がここで話していることを理解するのに役立ちます。たとえば、 'char * contents_chopped = contents + 1;'とします。 – biocyberman

答えて

41
if (contents[0] == '\n') 
    memmove(contents, contents+1, strlen(contents)); 

あるいは、ポインタを変更することができる場合:

if (contents[0] == '\n') contents++; 
+2

+1私にそれを打つ。 –

+1

ああ、mems関数がstrings.hで何をするのか、それはクールです。その最初の提案は完全に機能します! – Ash

+3

と、 'memmove'は' memcpy'ではなく 'memmove'を使う必要があることに注意してください。 –

19

char* contents_chopped = contents + 1;

これは、同じ文字列を指しcontents_choppedになり、最初の文字を除いて\ nの後の次になり

また、この方法は高速です。

+0

ポインタの有効性は 'contents'の妥当性に依存することに注意してください。そうすれば、' contents_chopped'でいくつかの簡単な処理をしたいだけなら良いです。空の文字列もチェックする必要があります。 – tia

+0

+1は現実世界のコードが使用すべき答えを与えるためのものです。尾を利用するために文字列全体をコピー/移動するのは時間の無駄ですが、実際にそのようなことを行う悲しいことに多くのプログラムがあります... –

+0

私はそれがいかに簡単かは分かりますが、それが必要です。 –

3

char *が "文字"を含むという印象を受けているかのように聞こえます。それはしません。単にポイントバイトです。残りの文字列は、次のヌルバイトまでメモリ内の次のバイトで構成されることを意味します。 ( 'char'データ型はバイトであるが、実際には文字ではないことに注意してください。Unicodeに注意してください。また、バイトは必ず八重奏です。)

char *は配列でもありませんが、ポインタがその配列の先頭を指すような文字配列が存在することもあります。

13

メモリがmallocされているとプログラムがクラッシュするだけでポインタをインクリメントしないでください。には、元のポインタが必要です。あなたはポインタをコピーしたり、メモリの新しい塊を作成したり、それをmemcpyしたり、ptr + 1やその他の方法でアクセスすることができますが、ポインタを増加させるだけの人は危険なアドバイスをしています。このサンプルプログラムを実行して、「ポインタを増やす」ときに何が起こるかを確認することができます。

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
int main(void) 
{ 
    char *str = (char *)malloc(10); 
    strcpy(str, "1234567890"); 
    printf("%s\n", str); 
    str++; 
    printf("%s\n", str); 
    free(str); 
} 

ヒント:ここでの結果です:

[[email protected] ~]$ ./foo 
1234567890 
234567890 
*** glibc detected *** ./foo: free(): invalid pointer: 0x08c65009 *** 
======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x724591] 
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x725de8] 
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x728ecd] 
./foo[0x80484e3] 
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x6cfbd6] 
./foo[0x80483f1] 
======= Memory map: ======== 
001c9000-001e4000 r-xp 00000000 08:01 2883609 /lib/ld-2.11.1.so 
001e4000-001e5000 r--p 0001a000 08:01 2883609 /lib/ld-2.11.1.so 
001e5000-001e6000 rw-p 0001b000 08:01 2883609 /lib/ld-2.11.1.so 
006b9000-0080c000 r-xp 00000000 08:01 3015690 /lib/tls/i686/cmov/libc-2.11.1.so 
0080c000-0080d000 ---p 00153000 08:01 3015690 /lib/tls/i686/cmov/libc-2.11.1.so 
0080d000-0080f000 r--p 00153000 08:01 3015690 /lib/tls/i686/cmov/libc-2.11.1.so 
0080f000-00810000 rw-p 00155000 08:01 3015690 /lib/tls/i686/cmov/libc-2.11.1.so 
00810000-00813000 rw-p 00000000 00:00 0 
00e4d000-00e4e000 r-xp 00000000 00:00 0   [vdso] 
00fe0000-00ffd000 r-xp 00000000 08:01 2883667 /lib/libgcc_s.so.1 
00ffd000-00ffe000 r--p 0001c000 08:01 2883667 /lib/libgcc_s.so.1 
00ffe000-00fff000 rw-p 0001d000 08:01 2883667 /lib/libgcc_s.so.1 
08048000-08049000 r-xp 00000000 08:01 9700477 /home/mfisch/foo 
08049000-0804a000 r--p 00000000 08:01 9700477 /home/mfisch/foo 
0804a000-0804b000 rw-p 00001000 08:01 9700477 /home/mfisch/foo 
08c65000-08c86000 rw-p 00000000 00:00 0   [heap] 
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b776f000-b7770000 rw-p 00000000 00:00 0 
b7780000-b7783000 rw-p 00000000 00:00 0 
bfc22000-bfc37000 rw-p 00000000 00:00 0   [stack] 
Aborted 
+2

良い点、これは私がインクリメント方法を使っているので今私に起こっています、私はあなたがここに示したものと同様のエラーも見ています。この回答の唯一の問題は、コード解決策がないことです。 –

-1

ここでは私のコードCの初心者のために

char * bastakiniSil(char *contents){ 
char *p = malloc(sizeof(*p) * strlen(contents)); 
int i; 
for(i=0; i<strlen(contents); i++) 
{ 
    p[i]=contents[i+1]; 
} 

return p; 

}

関連する問題