动态创建变量时[i]的未声明标识符

Int*_*ers 1 c encryption

以下代码应该使用停止密码加密一个句子,它仍然是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); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

我明白了

caeser.c:15:23 use of undeclared identifier i. 
Run Code Online (Sandbox Code Playgroud)

哪个就行了 char temp = value[i];

Kni*_*nug 5

删除for行尾的分号:

for(int i = 0;i<n; i++);
Run Code Online (Sandbox Code Playgroud)

声明int i在那里使它成为for块的本地,但由于分号是一个空块.

所以在下面的代码块(之间{ })i没有声明,因为它不属于for.

这也将修复程序不执行for多次的主体(如果编译它将会执行).如果这已编译,for循环将循环直到n但不执行任何操作.然后,花括号之间的代码将被执行i == n(假设i然后该代码块可见).因此,您的代码将始终执行temp == '\0'(终止null value)并始终打印相同的密码值.

ENCORE :(正如评论中所解释的那样,但这里是为了完整性)

由于两个原因,将字符文字转换为ints(int conv = temp - (int)'A';)是不必要的:

  1. 与可能看起来直观的字符文字相反int,不是chars(我认为这在C++中是不同的)
  2. 但即使不是这样的情况,a char总是小于a int,因此总是适合内部,int因此可以安全地进行推广.