以下代码应该使用停止密码对句子进行加密,它仍然是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];
答案 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';
)的字符文字的转换是不必要的:
int
s,而不是char
s(我认为这在C ++中是不同的)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语句(仅由分号组成)不执行任何操作。