我正在创建一个程序,该程序将文件读取为字符串,并将所有字符大写,并删除任何非字母的内容。
我不知道我在这里做错了什么。在第一次执行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] == ' '))
{
printf("%sn", plainText[textFileElement]);
}
else
{
printf("%sn", plainText[textFileElement]);
}
}
printf("n");
}
fclose(fpCongress);
}
Thx用于编辑正确的缩进。
这是您的问题:
for (textFileElement = ' '; textFileElement < strlen(plainText); ++textFileElement)
{
if (!(plainText[textFileElement] >= 'A' && plainText[textFileElement] <= 'Z'
|| plainText[textFileElement] == ' '))
{
printf("%sn", &plainText[textFileElement]);
}
else
{
printf("%sn", plainText[textFileElement]);
}
}
在第二次打印时,您忘记获取地址,因此printf函数尝试读取plainText[textFileElement]
位置的字符串,而不是它的位置。
这是更正后的代码:
for (textFileElement = ' '; textFileElement < strlen(plainText); ++textFileElement)
{
if (!(plainText[textFileElement] >= 'A' && plainText[textFileElement] <= 'Z'
|| plainText[textFileElement] == ' '))
{
printf("%sn", plainText + textFileElement);
}
else
{
printf("%sn", plainText + textFileElement);
}
}
还借此机会向你展示了另一种写这篇文章的方法,说明你正在使用指针。
顺便说一句,这解决了您的segfault错误,但可能仍然没有给出所需的行为,因为您的原始代码对此并不清楚。