2017-03-28 40 views
-2

文字列の繰り返し文字を消去する関数を取得するはずです。私のコードは次のとおりです。別の関数で関数を呼び出す:セグメンテーションフォールト(コアダンプ)

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

#define DIM 100 

char* mystrcpy(char [], char[]); 
char* repeticoes(char []); 

int main() 
{ 

char str1[DIM]="John Joanne"; 
printf("%s", repeticoes(str1)); 


return EXIT_SUCCESS; 
} 

char* mystrcpy(char _dest[], char _orig[]) 
{ 
int i=0; 
for (i=0; _orig[i]!='\n'; i++) 
    _dest[i]=_orig[i]; 
_dest[i]='\0'; 
return _dest; 
} 


char* repeticoes(char _s[]) 
{ 
int i=0,j=0; 
char news[DIM]={'\0'}; 
for (i=0, j=0; _s[i]!='\0'; i++) 
{ 
    if(mystrcnt(_s, _s[i])==1) 
     news[j++]=_s[i]; 
} 
news[j]='\0'; 
mystrcpy(_s, news); 

return _s; 
} 

mystrcpyは前の練習で作成した関数です。 問題は、セグメンテーションフォルト(コアがダンプされています)を取得していることです。 しかし、文字列ライブラリ関数strcpyを使用しようとすると、プログラムが正常に実行されます。では、私の機能には何が問題なのですか?私は、文字列を正しく引数として宣言/初期化/渡していませんか?

ありがとうございます!

編集:str1を示すのを忘れました。あなたの関数で

+1

少なくとも完全に動作する例を提供します。問題はおそらく境界チェックが不完全であることでしょう。デバッガで実行します。 – csl

+2

あなたが提示したコードが私のためにコンパイルされていないので、セグメンテーションフォルトを報告するのは驚くべきことです。確かに、あなたのコンパイラは宣言されていない(そして初期化されていない)変数の使用について警告しました。 –

+1

mystrcnt関数も表示 – Sniper

答えて

1

mystrcpyこのループ -

for (i=0; _orig[i]!='\n'; i++)  //can cause accessing index out of bounds 

なぜ'\n'をチェックし、後で'\0'を追加?一度確認したら_orig'\n'が含まれていることを理解するでしょう。

ループは'\0'まで実行してコピーできます。

+0

ああ!ありがとう!以前の練習では、ユーザーから文字列を取得するためにfgetsを使用していたので、私はそれを行いました。 fgetsは文字列に '\ n'の前に '\ n'を置くので、 '\ n'を使用しました(コピーした文字列を印刷する必要があるときは\ nを印刷しませんでした)。どうもありがとうございました! –

+1

@GrangerObliviate喜んで助けた。 – ameyCU

関連する問題