0

文字列の一部の順序を逆にする関数を作ろうとしています。ポインタを使用するのは初めてで、何らかの理由で文字列の文字の場所にアクセスして部分文字列をコピーできますが、同じ場所に戻すことはできません...

反転した部分文字列を元の場所にコピーしようとすると、次のようになります。

プログラム受信信号SIGSEGV、セグメンテーション違反。0x00007ffff7b5dc66 in ?? ()/lib/x86_64-linux-gnu/libc.so.6から

どんな助けでも素晴らしいでしょう!

これが私がこれまでに持っているものです:

void reverse(char* line, int start, int end){

      char str[end-start];

      memcpy ( str , line + start , end-start );

      reverseSubString ( str );

      memcpy ( line + start, str , end-start );

}

void reverseSubString(char* str){

    int i, j, len;
    char temp;

    i=j=len=temp=0;

    len=strlen(str);

    for (i=0, j=len-1; i<=j; i++, j--)
    {
        temp=str[i];
        str[i]=str[j];
        str[j]=temp;
    }
}
4

2 に答える 2

3
  char str[end-start];

  memcpy ( str , line + start , end-start );

元の文字列の 0 ターミネータが含まれていない限り、char配列は 0 で終了していません。そう

len=strlen(str);

それがまだクラッシュしていない場合、誰が何を知っているかを計算します。それで

for (i=0, j=len-1; i<=j; i++, j--)
{
    temp=str[i];
    str[i]=str[j];
    str[j]=temp;
}

割り当てられたメモリの外側にアクセスします。

于 2013-02-26T22:47:28.270 に答える
1

reverseSubstring()渡された文字列を呼び出すため、NUL で終了する C 文字列strlen()が必要です。ただし、reverse関数で文字列を NUL で終了することに失敗します。それを行うか、さらに良いことに、length引数を渡します。

void reverseSubString(char *str, size_t len)
{
    int i, j;
    char temp;

    for (i = 0, j = len - 1; i <= j; i++, j--) {
        temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
}

void reverse(char *line, int start, int end)
{
    char str[end - start];
    memcpy(str, line + start, end - start);
    reverseSubString(str, end - start);
    memcpy (line + start, str, end - start);
}
于 2013-02-26T22:47:32.150 に答える