在cipherLab.exe中的0x0FD61BCC(ucrtbased.dll)处引发异常:0xC0000005:访问冲突读取位置0x00000043

时间:2018-08-05 04:00:33

标签: c visual-studio-2017

我正在创建一个程序,它将文件读入字符串,并将所有字符大写,并删除所有非字母的字符。

我不确定我在这里做错了什么。第一次执行else语句后,我会收到一个异常:

  

“访问冲突读取位置0x00000043”

我不知道这是什么意思,甚至如何纠正。
任何帮助将不胜感激。

这是我的代码:

int main(void)
{
    char plainText[300], message;
    char cipherText[300];

    fpOutput = fopen("csis.txt", "w");

    processFile(plainText);
    cipher(cipherText, plainText);
    fclose(fpOutput);
    return 0;
}
//reads file into string
void processFile(char plainText[], int size)
{
    int textFileElement = 0;
    char textFile;

    if (!(fpCongress = fopen("congress.txt", "r")))
    {
        puts("File could not be opened for input");
        exit(1);
    }

    while (!feof(fpCongress))
    {
        for (textFileElement = 0; textFileElement < strlen(plainText); textFileElement++)
        {
            textFile = getc(fpCongress);
            plainText[textFileElement] = textFile;
            //checks for lowercase letters in string
            if (islower(plainText[textFileElement])) 
            {
                //capitalizes all lower case letters in strings
                putchar(toupper(plainText[textFileElement]));
            }
        }

        for (textFileElement = 0; textFileElement < strlen(plainText); ++textFileElement)
        {
            //removes any special characters and spaces
            if (!(plainText[textFileElement] >= 'A' && plainText[textFileElement] <= 'Z'
                    || plainText[textFileElement] == '\0'))
            {
                printf("%s\n", plainText[textFileElement]);
            }

            else
            {
                printf("%s\n", plainText[textFileElement]);
            }
        }

        printf("\n");
    }
    fclose(fpCongress);
}

1 个答案:

答案 0 :(得分:0)

Thx,用于编辑适当的缩进。

这是您的问题:

for (textFileElement = '\0'; textFileElement < strlen(plainText); ++textFileElement)
{
    if (!(plainText[textFileElement] >= 'A' && plainText[textFileElement] <= 'Z'
            || plainText[textFileElement] == '\0'))
    {
        printf("%s\n", &plainText[textFileElement]);
    }

    else
    {
        printf("%s\n", plainText[textFileElement]);
    }
}

在第二张照片上,您忘记了地址,因此printf函数尝试读取位置plainText[textFileElement]而不是位置的字符串。

已更正代码:

for (textFileElement = '\0'; textFileElement < strlen(plainText); ++textFileElement)
{
    if (!(plainText[textFileElement] >= 'A' && plainText[textFileElement] <= 'Z'
            || plainText[textFileElement] == '\0'))
    {
        printf("%s\n", plainText + textFileElement);
    }

    else
    {
        printf("%s\n", plainText + textFileElement);
    }
}

还借此机会向您展示了另一种编写方法,表明您正在使用指针。

这可以解决您的段错误,但仍然可能无法达到预期的效果,因为您的原始代码尚不清楚。