我昨天写了这段代码。它编译/构建正常,没有错误,并打开Windows命令提示符,要求我输入原始文本。我输入原始文本,我希望我的程序编码并按Enter键。这会导致以下错误:
EncodeTextApp.exe中的0x00007FFC284DDDFF(ucrtbased.dll)抛出异常:0xC0000005:访问冲突写入位置0x00007FF7CAEC9C23。
如果存在此异常的处理程序,则可以安全地继续该程序。
当我在程序运行时输入要在命令提示符中编码的消息时,会发生上述异常。然后它就崩溃了。
以下代码是我的应用程序中的代码。我不知道我在这里做错了什么。
#include <stdlib.h>
#include <conio.h>
#include <iostream>
#define MAX_LEN 80
#define encodingshift 17
char* encode(char* str) {
int i = 0;
while (str[i] != '\0') {
str[i] = str[i] - encodingshift;
/*str[i] = (char)((int)str[i] + encodingshift) % 26;*/
}
return (str);
}
void main() {
char *str = "";
printf("Please enter the message to encode: ");
fgets(str, MAX_LEN, stdin);
char* original = str;
str = encode(str);
printf("\nOriginal Message: %s", original);
printf("\nEncoding Shift: %d", encodingshift);
printf("\nEncoded message: %s", str);
getchar();
}
我已经完成了所有工作,从卸载Visual Studio中的c ++项目并重新安装它们,再次安装整个Visual Studio,但错误并没有消失。因此,我想知道我要做什么。这是阻止我使用我的程序的唯一因素。
答案 0 :(得分:3)
char *str = "";
printf("Please enter the message to encode: ");
fgets(str, MAX_LEN, stdin);
错误,str
是一个字符串文字(放在只读段上,因此不可修改),你需要有空间用fgets
存储字符串,改为:
char str[MAX_LEN];
和
str = encode(str); /* str now is an array, you can not assign to */
到
encode(str);
请注意,您没有在i
循环中增加while
(无限循环)
此外,您正在混合C和C ++,不要这样做,如果您想要C,iostream
应为stdio.h
并使用main
的有效签名:{{1而不是int main(void)