下面的代码应该使用 ceasers 密码来加密一个句子,它仍然是 WIP,我没有考虑空格、小写字母等。
int main(int argc,string argv[])
{
int k = atoi(argv[1]);
string value = GetString();
int n = strlen(value);
for(int i = 0;i<n; i++);
{
char temp = value[i];
int conv = temp - (int)'A';
int cipher = (conv + k)%26;
char final = cipher + (int)'A';
printf("%c\n",final);
}
}
我明白了
caeser.c:15:23 use of undeclared identifier i.
在 char temp = value[i];
行上
最佳答案
删除 for
行末尾的分号:
for(int i = 0;i<n; i++);
在那里声明 int i
使其成为 for
block 的本地,但由于分号是一个空 block 。
所以在下面的代码块中({ }
之间)i
没有声明,因为它不属于for
。
这也将修复程序不会多次执行 for
的主体(如果编译的话它会执行)。如果这已经编译,for
循环将一直循环到 n
但不会执行任何内容。然后,花括号之间的代码将使用 i == n
执行(假设 i
然后对该代码块可见)。因此,您的代码将始终以 temp == '\0'
(value
中的终止 null)执行,并始终打印相同的密码值。
ENCORE:(如评论中所述,但出于完整性考虑)
将字 rune 字转换为 int
(int conv = temp - (int)'A';
) 是不必要的,原因有两个:
- 与看似直观的字 rune 字相反,字 rune 字是
int
,而不是char
(我相信这在 C++ 中是不同的) - 但即使 1. 不是这种情况,
char
总是比int
小,因此总是适合int
> 这样它就可以安全地得到推广。
关于c - 动态创建变量时 [i] 的未声明标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19696241/