Segmentation fault (core dumped)の解決方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hanoha1631
記事: 5
登録日時: 2年前

Segmentation fault (core dumped)の解決方法

#1

投稿記事 by hanoha1631 » 2年前

以下は入力された文字列におい重複する文字はないか判定するコードです。コンパイルは通るのですが実行時入力後にSegmentation fault (core dumped)と表示され正しく実行されません。これはどこを誤ってしまっているのですか?
回答よろしくお願いします。

コード:

#include<stdio.h>
int main(){
  char *str;
  int i,j,count=0;
  scanf("%s",str);
  for(i=0;*(str+i)!='\0';i++){
    for(j=0;*(str+j)!='\0';j++)if(*(str+i)==*(str+j))count++;
    if(count>=2){ //自分以外の文字と遭遇したら2以上になるのでこれを判定法としました
      printf("重複あり\n");
      goto a;
    }
  }
  printf("重複なし\n");
 a:  return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Segmentation fault (core dumped)の解決方法

#2

投稿記事 by みけCAT » 2年前

ポインタ str を初期化せずにデリファレンスしてしまっているのが誤りです。
有効なバッファのアドレスに初期化してから入力の読み込みや処理をしないといけません。
また、バッファオーバーランを防ぐため、%s で文字列を読み込む時は読み込む最大の長さを指定するべきです。
この最大の長さは、最後にナル文字が入るため多くてもバッファサイズ-1にするべきです。
さらに、scanf() の戻り値は無視せず、意図した数の入力をちゃんと読み込めたか確認するべきです。

コード:

#include<stdio.h>
#include <stdlib.h>
int main(){
  char *str;
  int i,j,count=0;
  str=malloc(1024000); /* バッファを初期化する */
  if(str==NULL){
    printf("メモリ確保エラー\n");
    return 1;
  }
  if(scanf("%1023999s",str)!=1){ /* 読み込む最大の長さを指定し、読み込めたかを確認する */
    printf("入力エラー\n");
    return 1;
  }
  for(i=0;*(str+i)!='\0';i++){
    for(j=0;*(str+j)!='\0';j++)if(*(str+i)==*(str+j))count++;
    if(count>=2){ //自分以外の文字と遭遇したら2以上になるのでこれを判定法としました
      printf("重複あり\n");
      goto a;
    }
  }
  printf("重複なし\n");
 a:  free(str); return 0; /* 確保したバッファを開放する */
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: Segmentation fault (core dumped)の解決方法

#3

投稿記事 by box » 2年前

コード:

  char *str;
まあ通常は適切なサイズの配列にするんでしょうね。
バッファーオーバーフローへの対応をすべきかどうかはお任せします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

hanoha1631
記事: 5
登録日時: 2年前

Re: Segmentation fault (core dumped)の解決方法

#4

投稿記事 by hanoha1631 » 2年前

回答ありがとうございます。不定な場所への入力は総じてSegmentation fault (core dumped)なんですね。エラー処理の件も心がけるようにします。
また重ねての質問失礼します。不定回避によってこのエラーはでなくなりましたが1文字の入力以外は全て重複ありと表示されてしまいます。
おそらくアルゴリズム自体に問題があると思うのですがそこを直せばいいのか分かりません。よろしければ教えていただけると嬉しいです。
$ ./a.out
w
重複なし

$ ./a.out
a
重複なし

$ ./a.out
aq
重複あり

$ ./a.out
aa
重複あり

hanoha1631
記事: 5
登録日時: 2年前

Re: Segmentation fault (core dumped)の解決方法

#5

投稿記事 by hanoha1631 » 2年前

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

int main(){
char *str;
int i,j,count=0;
str=malloc(1024000);
scanf("%s",str);
for(i=0;*(str+i)!='\0';i++){
for(j=0;*(str+j)!='\0';j++)if(*(str+i)==*(str+j))count++;
if(count>=2){
printf("重複あり\n");
goto a;
}
count=0;
}
printf("重複なし\n");
a: return 0;
}

count=0;の処理を抜かしていたためにうまく実行されていませんでした。
御二方、回答ありがとうございました!!

返信

“C言語何でも質問掲示板” へ戻る