我已经编写了执行Caesar Shift Cipher的代码,以从名为“ input.txt”的文件中获取输入并将输出写入名为“ output.txt”的文件中。从技术上讲,它工作正常;输出几乎完美,但是当我运行它时,我收到有关Debug Assertion FailedLine 56消息,这是关闭输出文件的行。该错误还显示:表达式:(unsigned)(c+1) <= 256。这是我的代码:

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”进行加密时,它将它们放在一起而不是像预期的那样将它们放在单独的行上。如果有人知道为什么会这样,并且可以帮助我,我将不胜感激,但主要的是那个错误。

最佳答案

这里有两个问题。

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


错了getc返回int,因此c也应该是int。原因是getc有两种类型的返回值:


一个正值,可以表示为无符号字符。
负值,表示错误。


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

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

<ctype.h>是从中获取isalphatoupper函数的位置。


  7.4字符处理
  
  1标头声明了几个有用的函数
  198)在所有情况下,参数为
  一个int,其值应表示为无符号字符
  或应等于宏EOF的值。如果参数有
  其他值,则行为未定义。


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

关于c - 凯撒密码;调试断言失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16183337/

10-11 18:58