1

下面的代码应该使用停止者密码加密一个句子,它仍然是 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];

4

2 回答 2

5

删除for行尾的分号:

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

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

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

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

ENCORE:(如评论中所述,但为了完整起见,这里)

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

  1. 与看起来直观的字符文字相反的是ints,而不是chars(我相信这在 C++ 中是不同的)
  2. 但即使 1. 不是这种情况,achar也总是小于 an int,因此总是适合在 an 内,int因此可以安全地提升它。
于 2013-10-31T00:23:10.810 回答
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 标准草案告诉我们,在 for 之后是语句表达式,表达式部分6.8.3 和空语句 具有以下表达式语句的语法:

expression-statement:
  expressionopt ;

在第3段中告诉我们空语句只是一个空语句

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

于 2013-10-31T00:24:17.980 回答