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

时间:2013-10-31 00:17:02

标签: 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); 
    } 
}

我得到了

caeser.c:15:23 use of undeclared identifier i. 

位于char temp = value[i];

2 个答案:

答案 0 :(得分:5)

删除for行末尾的分号:

for(int i = 0;i<n; i++);

声明int i使其成为for块的本地,但由于分号是空块。

因此,在以下代码块中({ }之间)i未声明,因为它不属于for

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

ENCORE :(如评论中所述,但为了完整起见,此处为

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

  1. 与看似直观的字符文字相反,int s,而不是char s(我认为这在C ++中是不同的)
  2. 但即使1.不是这样,char总是小于int,因此总是适合int,因此可以安全地推广。{ / LI>

答案 1 :(得分:2)

你的问题在这里:

for(int i = 0;i<n; i++);
                       ^

;结束 for 循环,它运行n次,但不执行任何操作,因为;只是结束 null语句。所以{}之后只是一个复合语句,它有自己的范围,不包括i的声明:

{
  char temp = value[i]; // i does not exist here since it declared in for loop
                        // and it's scope ends with the for loop
  //...
}

C99 draft standard告诉我们 之后的内容是语句表达式6.8.3 表达式和null语句表达式语句具有以下语法:

expression-statement:
  expressionopt ;

并在段落 3 中告诉我们,空状态只是 null语句

  

null语句(仅由分号组成)不执行任何操作。

相关问题