2017-11-13 25 views
-2

入力を確認した後セグメンテーションフォルトがポップアップし、なぜ表示されません。両方の配列のサイズを増加し、除去:私は端末入力からフロートを読み取る際のセグメンテーションフォルト

コード

#include "stdio.h" 
#include "stdlib.h" 
#include "string.h" 

#define EMPTY 3.141592 
#define BUFFERSIZE 100 

void removeSubstring(char *s,const char *toremove){ 
    while((s=strstr(s,toremove))) 
    memmove(s,s+strlen(toremove),1+strlen(s+strlen(toremove))); 
} 

int main(){ 

    int x=0; 
    int y=0; 
    float a[BUFFERSIZE] = {EMPTY}; 
    char buffer[BUFFERSIZE] = {EMPTY}; 
    char *pos; 
    char *start = 0; 
    int space = ' '; 

    printf("Input: "); 
    fgets(buffer, BUFFERSIZE, stdin); 

    while(x< BUFFERSIZE){ 
      sscanf(buffer, "%f ", &a[x]); 
      pos = strchr(buffer, space); 
      removeSubstring(start, pos); 
      x++; 
      } 

    printf("Saved input: "); 
    while(y<BUFFERSIZE && a[y] != EMPTY){ 
      printf("%.2f", a[y]); 
      y++; 
      } 

    printf("\n"); 

    return 0; 
} 

編集...端末入力から山車の未定義の数を読み取るためにループでfgetssscanfを使用するように指示し、これは私が思い付いたものですましたfeof

+2

[小規模なプログラムをデバッグする方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – alk

+2

こちらもご覧ください:https://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong – Fang

+1

GDBは次のように言っています:soCでの#1 removeSubstring(s = 0x0、toremove = 0x0)の0x00000000004008a7: 9 ' – LethalProgrammer

答えて

1

ほぼ確実に問題はラインpos = strchr(buffer, space);です。入力に空白文字が含まれていない場合、posはNULLに等しく設定されます。 strstr()にNULLを渡すと、おそらくSEGVが発生します。

+0

はい、それを指摘してくれてありがとう、私はそれをデバッガで見ることができました。私は、ターミナル入力の読み方を解決するために、書き直された新しいバージョンのコードを使用していますが、私のアプローチとコードそのものについて再考する必要があります。 – Mori

関連する問題