0

同様の文字を削除するためのアルゴリズムコードを書いています。例の場合。入力文字列が「abb」の場合、出力は「a」であり、「abcddbf」文字列の場合、出力は「acf」である必要があります。

以下に示すようにいくつかのコードを書きましたが、セグメンテーション障害を取得する方法がいくつかあり、問題のあるポイントを見つけることができません。

コード :

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

char *remove_adjecent_string(char *in,int count)
{
int i=0;
int j=0;
int flag = 0;
int total = strlen(in);
static char *output = NULL;

if(count == 0)
{
    output=(char *)malloc(sizeof(char)*total);
    if(output == NULL)
    {
            return NULL;
    }
    for(i=0,j=0;i<=total;i++)
    {
            if(in[i] != '*')
            {
                    output[j]=in[i];
                    j++;
            }
    }
    return (char *)output;
}

for(i=0;i<=count;++i)
{ 
    printf("In loop i  :%d count :%d \t",i,count);
    printf("Before comparition in[i] = %c , in[count] = %c \t",in[i],in[count]);
    if(in[i] == in[count])
    {
            printf("Same found in[%d]  = in[%d] = %c",i,count,in[i]);
            in[i]='*';
            flag = 1;
    }
    printf(" Next loop i = %d\n",++i);
}

printf("Before Recursion \n");
output =remove_adjecent_string(in,(count-1));
return (char *)output;
}


int main()
{
  char *input;
  char *output;
  int i=0;
  input = (char *)malloc(sizeof(char)*10);
  if(input == NULL)
  {
          return;
  }
  output=(char *)malloc(sizeof(char)*10);
  if(output == NULL)
  {
          return;
  }
  input = "abbb";
  int  count = -1;
  count=strlen(input);
  output=remove_adjecent_string(input,(count-1));
  printf("Input String = %s\n",input);
  printf("Output String = %s\n",output);

}

不具合のあるケースを見つけるのを手伝ってください。

4

3 に答える 3

0

セグメンテーション違反を見つける方法:

  1. デバッグ シンボルを実行可能ファイルに追加します。g++ または gcc を使用する場合は-g、コンパイラ コマンド ラインに -option を追加します。
  2. デバッガーでプログラムを実行します: gdb --args ./your-program [args]gdb および Linux の場合。
  3. と入力rしてプログラムを実行します。
  4. セグメンテーション違反が発生するのを待ちます
  5. と入力btして、コール スタックを出力します。コード内の一番上の行を見つけて、ファイル名と行番号を取得します。
  6. その線をよく見てください。
于 2013-10-12T06:10:38.577 に答える
0

私が検出したのは、文字列を含むremove_adjecent_string()バッファー (という名前) を返すことですが、このバッファーを ing してから入力するまでの間に、適切なヌル終了文字列(最後の文字の後) であることを確認することはありません。実際、そのために十分なスペースを割り当てることさえできません。outputmalloc\0

状況によっては、これによりprintf()メモリのガベージが出力され、さらにセグメンテーション違反が発生する可能性があります。これは、ヌルバイトがどこかで失われるのを最終的に見つけるまで、バッファの後にメモリ内にあるものを出力し続けるためです。

于 2013-10-12T06:10:55.543 に答える