26

誰か助けてくれませんか?char *Cのaから最初の文字を削除する必要があります。

たとえば 、配列の最初の文字として文字char * contentsが含まれています。'\n'この文字を検出して削除し、「サニタイズ」された後に元の変数を変更する必要があります。

誰かがコードを手伝ってくれますか?私はCにまったく慣れていないので、理解できないようです。

4

8 に答える 8

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

または、ポインタを変更できる場合:

if (contents[0] == '\n') contents++;
于 2010-11-28T07:00:51.463 に答える
24

char* contents_chopped = contents + 1;

これによりcontents_chopped、最初の文字が\ nの次の文字になることを除いて、同じ文字列を指すことになります。

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

于 2010-11-28T07:02:41.777 に答える
14

メモリをmallocした場合は、ポインタをインクリメントするだけではいけません。そうしないと、プログラムがクラッシュします。 freeには元のポインタが必要です。ポインタをコピーし、メモリの新しいチャンクを作成してそれを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);
}

ヒント:結果は次のとおりです。

[mfisch@toaster ~]$ ./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
于 2011-05-25T16:52:15.033 に答える
4

char*に文字が「含まれている」という印象を受けているように聞こえます。そうではありません。それは単にバイトを指しいます。文字列の残りの部分は、次のnullバイトまでのメモリ内の後続のバイトで構成されることを意味します。('char'データ型はバイトですが、定義上、実際には文字ではないことにも注意してください。Unicodeに注意してください。また、バイトは必ずしもオクテットではありません。)

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

于 2010-11-30T06:33:34.583 に答える
2
#include <stdio.h>
#include <string.h>

int main ()
 {
char src[50] = "123456789123434567678";

char dest[16]={0};
 memcpy(dest, src+1,sizeof(src));
 printf("%s\n",dest);
 return(0);
}

src+1 -> indicate how many char you want to remove
于 2018-03-26T05:35:30.423 に答える
0

文字が見つかった場合、基本的にその文字を無視し、ループを続けます。

void remove_character(char* string, char letter) {

int length = strlen(string);
int found = 0;

for (int i = 0; i < length; ++i)
{
    if (string[i] == letter)
    {
        found = 1;
        continue;
    }

    if (found == 1)
    {
        string[i-1] = string[i];
    }          
}

if (found == 1)
{
    string[length - 1] = '\0';
}

}

于 2022-03-01T18:47:03.547 に答える
-1

これが私のコードです

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;

}

于 2017-12-24T20:40:27.137 に答える
-2

これが私のコードです
とてもシンプルです

#include <stdio.h>
#include<stdlib.h>
int main()
{
    char *str=(char *)malloc(100*sizeof(char));
    scanf("%s",str);
    str=&str[1];
    printf("%s",str);
    return 0;
}

str =&str [1] //ここで1は、削除する文字数を示します。

于 2021-01-30T06:49:16.200 に答える