我对字符串有疑问。我正在完成一个编码维格纳密码的练习。
用其他语言很容易解决这个问题,但用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/