我对字符串有疑问。我正在完成一个编码维格纳密码的练习。
用其他语言很容易解决这个问题,但用C语言我有麻烦,我不知道为什么。
这是我的密码。

#include<stdio.h>
#include<string.h>

main()
{
    char mes[1000];
    char key[100];
    int n=strlen(mes);
    int cipher[n],i,j=0;

    printf("Enter message \n");
    scanf("%s",mes);

    printf("Enter keyword \n");
    scanf("%s",key);
    printf("len message= %d \n",strlen(mes));

    for(i=0;i<strlen(mes);++i)
    {
        mes[i]=toupper(mes[i]);
        key[j]=toupper(key[j]);
        if(j==strlen(key))
            j=0;
        cipher[i]=((mes[i]-0x41)+(key[j]-0x41)) % 26;
        printf("%c",cipher[i]+0x41);
        ++j;}
    printf("\n");
}

如果scanf数组输入少于16个字符,我的代码工作得很好,但是如果mes输入大于程序循环无限大。我不知道为什么。
如果我将mes数组的类型改为char类型,效果似乎更好,但结果仍然有如下错误输出:
Enter message
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Enter keyword
eeeeeeeeeeeeeeeeeee
len of message= 45
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE�EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAEEEEEEE

你能解释一下吗:
1)如果cipher数组是cipher类型,为什么我的代码会出错?
2)如果int是char,则输出更好,但为什么输出错误?

最佳答案

有几个问题:
cipher分配内存无法正常工作

int n=strlen(mes); // mes has nothing now..so n=0!
int cipher[n],i,j=0;

应在增量后进行回滚j
把这篇文章放在你读了两个输入之后..它应该可以在任何长度
 int cipher[strlen(mes)];
 for(i=0;i<strlen(mes);++i)
 {
     mes[i]=toupper(mes[i]);
     key[j]=toupper(key[j]);
     cipher[i]=((mes[i]-'A')+(key[j]-'A')) % 26; //use 'A' for better readability
     printf("%c",cipher[i]+'A');
     ++j;
     if(j==strlen(key))
         j=0;
 }

关于c - C语言编程,由于scanf而导致错误循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23320842/

10-11 22:50
查看更多