变量'PiglatinText'周围的堆栈已损坏

时间:2015-02-18 09:51:00

标签: c arrays

**Source.c**

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

#define SIZE 80
#define SPACE ' '

extern int isVowel(char);
extern void initialiseString(char[]);
extern int copyString(char[], char[], int);

int main() {
    char originalText[SIZE] = {'\0'};
    char piglatinText[SIZE] = {'\0'};
    char firstChar[SIZE];
    int i, j, k, l, wordCount;
    wordCount = 1;
    i = j = k = l = 0;

    printf("Enter the text for which you want to generate the piglatin\n");
    gets(originalText);

    while (originalText[i] != NULL) {
        if (originalText[i] == SPACE) {
            if (originalText[i + 1] != SPACE) {
                wordCount++;
            }
        }
        i++;
    }

    printf("Total words in the string are %i\n", wordCount);

    // piglatin Generator
    for (i = 0; i < wordCount; i++) {
        initialiseString(firstChar);
        l = 0;

        while (!isVowel(originalText[j]) && (originalText[j] != SPACE) && (originalText[j] != NULL)) {
            firstChar[l++] = originalText[j++];
        }

        if (isVowel(originalText[j])) {
            while ((originalText[j] != SPACE) && (originalText[j] != NULL)) {
                piglatinText[k++] = originalText[j++];
            }

            k = copyString(piglatinText, firstChar, k);
        } else {
            firstChar[l] = '\0';
            k = copyString(piglatinText, firstChar, k);
        }

        piglatinText[k++] = 'a';
        piglatinText[k++] = ' ';
        j++;
    }

    printf("The piglatin text\n");
    puts(piglatinText);

    getch();
    return EXIT_SUCCESS;
}

Functions.c

#include <string.h>

int isVowel(char ch) {
    if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ||
        ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U') {
        return 1;
    }

    return 0;
}

void initialiseString(char string[]) {
    int i;
    int len;
    len = strlen(string);
    i = 0;

    while (i <= len) {
        string[i++] = '\0';
    }

    return;
}

int copyString(char stringOne[], char stringTwo[], int k) {
    int i;
    int len;
    len = strlen(stringTwo);
    i = 0;

    while (len > 0) {
        stringOne[k++] = stringTwo[i++];
        len--;
    }

    return k;
}

这里的main函数出现在Source.c文件中,Source.c文件中使用的所有函数都在Functions.c文件中定义。

每当我运行此代码时,originalText都会被正确编码,但最终会生成错误堆栈变量'PiglatinText'已损坏!我试图通过调试找到错误,但无法找到错误源。

1 个答案:

答案 0 :(得分:1)

要向void initialiseString(char string[])函数传递未初始化的数组firstChar[SIZE]。在该功能中,您正在使用strlen() 在那个阵列上。这将导致未定义的行为。

很可能这个函数给你一个错误的长度,并且基于你错误地初始化它。这可能会导致堆栈在进一步处理时出现损坏。

您应该首先使用空字符初始化firstChar[SIZE],就像使用其他数组一样。

// piglatin Generator
    for (i = 0; i < wordCount; i++) {
        initialiseString(firstChar);  //<-- For first iteration of for loop this will cause problem as 'firstChar' is not initialized.
        l = 0;