0

ANSI C 文字列の末尾をトリミングしようとしていますが、関数でセグメント フォールトが発生し続けtrimます。

#include <stdio.h>
#include <string.h>

void trim (char *s)
{
    int i;

    while (isspace (*s)) s++;   // skip left side white spaces
    for (i = strlen (s) - 1; (isspace (s[i])); i--) ;   // skip right side white spaces
    s[i + 1] = '\0';
    printf ("%s\n", s);
}

int main(void) {
    char *str = "Hello World     ";
    printf(trim(str));
}

理由が分からないようです。私は15の異なるtrim機能を試しましたが、それらはすべてセグフォルトです。

4

3 に答える 3

1

"Hello World"指している文字列リテラルを変更しようとしていますが、strこれがセグ フォールトにつながります。

配列mainを作成します。str

char str[] = "Hello World     ";

またはmallocそれ:

char *str = malloc(sizeof("Hello World     ")+1);

"Hello World "タイプchar []はありますが、読み取り専用バッファに格納されています。ここで出力を確認してください。またprintf(trim(str));、関数から何も返さないため、これは意味がありませんtrim

于 2013-11-12T05:10:53.747 に答える
0

ではchar* str = "Hello world "、文字列"Hello World "はアドレス空間の読み取り専用に格納されます。読み取り専用メモリを変更しようとすると、未定義の動作が発生します。

代わりに使用

char str[] = "Hello World ";

また

char *str = malloc(sizeof("Hello World    ")+1);
strcpy(str, "Hello World    ");

次に、トリム機能を試してください...

変数にメモリを割り当てる方法の詳細については、https://stackoverflow.com/a/18479996/1323404を参照してください。

于 2013-11-12T05:26:09.860 に答える