学校项目细分错误

时间:2016-09-27 12:22:28

标签: c

我需要为学校制作这个程序,但由于“分段错误”(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);
}

1 个答案:

答案 0 :(得分:4)

在函数replaceVowelsA()中,用特定字符替换输入的字符串。在函数replaceVowelsA()中,您使用findOcurrace()查找是否存在Char。如果不是,它将返回-1,但你没有检查返回值,所以它可能返回-1,在代码行22中,它可能执行代码str[-1] = 'a',这是非常危险的行为。

您的字符串操作还存在其他问题,例如您没有检查的终止字符NULL

如果您使用gnu工具链,则可以添加-g选项。您也可以使用其他调试方法来查找问题。