2016-09-27 10 views
1

学校向けにこのプログラムを作成する必要がありますが、「セグメンテーション違反」(11)によってエラープロジェクトが終了しています。私はこれがプログラム中の記憶の不足と関係していると信じていますが、メモリが極端な量で使われるような機能は実際にはありません。どんな助けもありがとう。学校プロジェクトのセグメンテーションエラー

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

#define _CRT_SECURE_NO_WARNINGS 

int STRLEN = 36; 



int findOcurrance(char str[], char Char1){ 
for(int i = 0; i < STRLEN * 3; i++){ 
    if(str[i] == Char1) 
     return i; 
} 
return -1; 
} 

void replaceVowelsA(char str[], char Char) { 
for(int i = 0; i < STRLEN * 3; i++) { 
    int index = findOcurrance(str, Char); 
    str[index] = 'a';  
} 
} 

void insertaChar(char str[], char Char1, int index){ 
for(int i = STRLEN * 3; i >= index; i--){ 
    if(i != 0 && (str[i] != '\0' || i == strlen(str))){ 
     str[i] = str[i - 1]; 
    } 
    else if(i == 0){ 
     str[0] = ' '; 
    } 
} 
str[index] = Char1; 
} 

void adday(char str[]) { 
char consonants[42] = { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z', 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z'}; 
for(int i = 0; i < STRLEN * 3; i++){ 
    if(i==0){ 
     for(int c = 0; c < 42; c++){ 
      if(str[i] == consonants[c]){ 
       insertaChar(str, 'y', i); 
       insertaChar(str, 'a', i); 
       break; 
      } 
     } 
    } 
    else if(i != 0){ 
     if(str[i-1] == ' '){ 
      for(int c = 0; c < 42; c++){ 
       if(str[i] == consonants[c]){ 
        insertaChar(str, 'y', i); 
        insertaChar(str, 'a', i); 
        break; 
       } 
      } 
     } 
    } 
} 
} 

int findWords(char str[]){ 
int count = 0; 
for(int i = 0; i < STRLEN * 3; i++){ 
    char c = str[i]; 
    if(isspace(c)) 
     count++; 
    if(count == 2) 
     return i + 1; 
} 
return -1; 
} 

char* stringReorder(char str[], int i){ 
if(i == -1){ 
    return str; 
} 
else{ 
    char string1[STRLEN]; 
    char string2[STRLEN * 2]; 
    strncpy(string1, str, i); 
    strncpy(string2, &str[i], strlen(str) - i); 
    char string[STRLEN * 3]; 
    strcpy(str, string2); 
    strcat(str, " "); 
    strcat(str, string1); 
    return str; 
} 
} 

void main(void) { 
char mystring[STRLEN * 3]; 
printf("** Welcome to the Double Dutch game **\n"); 
printf("Please enter a string: "); 
scanf("%[^\n]s", mystring); 
char vowel = 'e'; 
replaceVowelsA(mystring, vowel); 
vowel = 'i'; 
replaceVowelsA(mystring, vowel); 
vowel = 'u'; 
replaceVowelsA(mystring, vowel); 
vowel = 'o'; 
replaceVowelsA(mystring, vowel); 
adday(mystring); 
int index = findWords(mystring); 
strcpy(mystring, stringReorder(mystring, index)); 
printf("Double Dutch translation: %s", mystring); 
} 
+0

どこからでも文字列ターミネータを確認していないように見えるようにしてください。 –

+6

デバッガの使い方を学ぶことは、コードの書き方を学ぶことよりも重要です。今度は前のスキルを学ぶ時です。 –

+0

'strncpy()'は、その名前にもかかわらず、**文字列**関数ではありません。結果として得られる "文字列"はすべての場合にゼロで終わらないかもしれません。結果の配列を適切な文字列関数( 'strcat()'など)に使うことはできません。 – pmg

答えて

4

replaceVowelsA()の機能では、入力した文字列を特定の文字に置き換えます。関数replaceVowelsA()では、Charが存在するかどうかを調べるためにfindOcurrace()を使用します。そうでなければ-1を返しますが、戻り値をチェックしていないので-1を返します。コード行22にコードstr[-1] = 'a'を実行すると非常に危険です。

また、文字の終了には他の問題があります。文字は終了文字NULLにチェックされていません。

gnuツールチェーンを使用している場合は、-gオプションを追加できます。また、他のデバッグ方法を使用して問題を見つけることもできます。

+0

ありがとう! :)これは少なくとも、セグメント化の問題を解決し、if文を実行しないようにするためにif文を追加しました。プログラムはまだ機能しませんが、何とかそれを理解することができればと思います –

関連する問題