C 凯撒密码;这个报错

C 凯撒密码;这个报错,c,C,我已经编写了代码来执行凯撒移位密码,从名为“input.txt”的文件中获取输入,并将输出写入名为“output.txt”的文件。从技术上讲,它运行良好;输出结果几乎完美,但当我运行它时,我得到一条关于第56行的调试断言失败消息,这是关闭输出文件的那一行。错误还表示:表达式:(unsigned)(c+1)这里有两个问题 char c, /* ... */; for(i=0;(c=getc(file1))!=EOF && i<MAX;i++) input[i]=c;

我已经编写了代码来执行凯撒移位密码,从名为“input.txt”的文件中获取输入,并将输出写入名为“output.txt”的文件。从技术上讲,它运行良好;输出结果几乎完美,但当我运行它时,我得到一条关于
第56行的
调试断言失败
消息,这是关闭输出文件的那一行。错误还表示:表达式:
(unsigned)(c+1)这里有两个问题

char c, /* ... */;
for(i=0;(c=getc(file1))!=EOF && i<MAX;i++)
    input[i]=c;
charc,/*…*/;

对于(i=0;(c=getc(file1))!=EOF&&i如果您使用的是MSVC,请注意调试CRT检查传递给isalpha的参数是否在范围
EOF
0..0xff
(请参阅)。在代码中,您正在调用
isalpha(输入[i])
使用
input
作为
char
数组。由于
isalpha
需要
int
值,您可能最终调用
isalpha
的值超出了允许的范围。您应该将调用更改为
isalpha((无符号字符)input[i])

我还将相应地将调用更改为
toupper


正如
undefined behavior
已经说过的,您必须将
getc
的结果存储在
int
变量中,将其与
EOF
进行比较,然后将其转换为
char
并存储。将其转换为
char
后,您无法再将其与
EOF
进行比较(
EOF
是一个
int
值,不能表示为
char
)。

“我对该站点还是相当陌生,我还没有完全弄清楚如何正确格式化代码而不使其爆炸。”选择您的代码块并点击
{/code>按钮。另请参见if
input[I]=='\n'
然后你什么也不写,因此“不那么紧迫的问题”是你有更多的代码没有共享吗?是否有一些函数或进程在测试你的输出以进行断言?那只有40多行代码。缺少什么?不,它工作不好。例如,它会吃掉文件的最后一个字符(与
strlen有关的是什么(输入)-1
)?对于两个,您并没有用空字符终止字符串。嗯,好吧。这是有道理的,但即使我将C更改为int,我仍然会得到一个错误。在某个地方更改为整数后是否需要强制转换C?
int C=getchar();char d=C;if(isalpha((unsigned char)d)){…}
存储
int
int
变量中返回值。当需要
无符号字符
值时,传递
无符号字符
值。
char c, /* ... */;
for(i=0;(c=getc(file1))!=EOF && i<MAX;i++)
    input[i]=c;