首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Caesar Cipher;调试断言失败

Caesar Cipher;调试断言失败
EN

Stack Overflow用户
提问于 2013-04-24 12:22:24
回答 2查看 379关注 0票数 0

我已经写了代码来做一个凯撒移位密码,从一个名为"input.txt“的文件中获取输入,并将输出写到一个名为"output.txt”的文件中。从技术上讲,它工作得很好;输出几乎是完美的,但当我运行它时,我得到了一条关于Line 56Debug Assertion Failed消息,它是关闭输出文件的行。该错误还显示: Expression:(unsigned)(c+1) <= 256。下面是我的代码:

代码语言:javascript
复制
void cipher(char input[], int key);

int main()
{

    int i, key=0;
    char c, input[MAX];
    FILE *file1;
    file1 = fopen("input.txt","r");

    printf("Enter the key: ");
    scanf("%d", &key);
    getchar();

    for(i=0;(c=getc(file1))!=EOF && i<MAX;i++)
        input[i]=c;
    fclose(file1);
    cipher(input, key);
    return 0;
}

void cipher(char input[], int key)
{
    int length = strlen(input)-1;
    int i;
    char c;
    FILE *file2;
    file2 = fopen("output.txt","w");
    for (i=0;i<length;i++)
    {
        if (isalpha(input[i]))
        {
            c = (toupper(input[i]) - 'A'+key) % 26 + 'A';
            fprintf(file2, "%c", c);
        }
        else if (input[i]==' ')
            fprintf(file2, "\n");
    }

    fclose(file2);
}

哦,还有一个不那么紧迫的问题,但是当代码吐出输入时,如果输入换了行,比如“input text\n here”,那么当它对"text“和"here”进行加密时,它会把它们放在一起,而不是像它应该的那样把它们放在单独的行上。如果有人知道这是为什么,并且可以帮助我,我将不胜感激,但最主要的是这个错误。

EN

回答 2

Stack Overflow用户

发布于 2013-04-24 13:49:23

这里有两个问题。

代码语言:javascript
复制
char c, /* ... */;
for(i=0;(c=getc(file1))!=EOF && i<MAX;i++)
    input[i]=c;

这是错误的。getc返回一个int,所以c也应该是一个int。原因是getc有两种类型的返回值

无符号负值正值,可表示为表示错误的

  1. 负值。

如果直接转换为char,则无法检查错误。char可能是签名的,也可能是未签名的。如果它是无符号的,那么(c=getc(file1))最终将是一个正数,这不可能与EOF相等。因此,当遇到EOF时,您的循环不会结束。如果您的char是签名的,那么您的程序可能会以其他奇怪的方式出现故障,例如过早终止循环,或者在某些机器上出现段故障。

这适用于所有标准的C函数!确保在转换包含scanf的返回值!之前检查返回值。

<ctype.h>是您获取isalphatoupper函数的地方。

7.4字符处理

1标头声明了几个对字符分类和映射有用的函数。198)在所有情况下,参数都是int,其值应可表示为unsigned char或等于宏EOF的值。如果参数有任何其他值,则行为未定义。

在我看来,通过将可能为负值的值传递到isupper中,您可能正在调用未定义的行为。

票数 0
EN

Stack Overflow用户

发布于 2013-04-24 17:53:26

如果您使用的是MSVC,请注意debug CRT会检查传递给isalpha的参数是否在EOF0..0xff范围内(参见MSDN。在您的代码中,您将使用input作为char数组来调用isalpha(input[i])。因为isalpha需要一个int,所以您最终可能会使用超出允许范围的值来调用isalpha。您应该更改对isalpha((unsigned char)input[i])的调用。

我还会相应地更改对toupper的调用。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16183337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档