凯撒';C中的s密码
我正在尝试做一个程序,接收一个字符数组作为输入,每个字母被另一个字母替换。在下面的代码中,我只考虑一个更改(‘a’->‘h’),但是一旦程序为该更改工作,我将实现其他(基于例如凯撒密码)。 问题是,程序编译成功,但是,当我运行它时,如果我插入一个“a”,他会返回另一个“a”(它应该返回一个“h”)。 代码有什么问题? 提前谢谢凯撒';C中的s密码,c,caesar-cipher,C,Caesar Cipher,我正在尝试做一个程序,接收一个字符数组作为输入,每个字母被另一个字母替换。在下面的代码中,我只考虑一个更改(‘a’->‘h’),但是一旦程序为该更改工作,我将实现其他(基于例如凯撒密码)。 问题是,程序编译成功,但是,当我运行它时,如果我插入一个“a”,他会返回另一个“a”(它应该返回一个“h”)。 代码有什么问题? 提前谢谢 #include <stdio.h> void ciphering (char text[]) { int i; for (i=0; i!
#include <stdio.h>
void ciphering (char text[])
{
int i;
for (i=0; i!='\0'; i++)
{
if (text[i]>='a' && text[i]<='z')
{
if (text[i]=='a')
text[i]='h';
}
}
}
int main()
{
char text[1000];
scanf("%s", text);
ciphering(text);
printf("%s\n", text);
return 0;
}
#包括
无效加密(字符文本[])
{
int i;
对于(i=0;i!='\0';i++)
{
如果(text[i]>='a'&&text[i]程序没有进入for()
循环,因为继续条件为false:
for (i = 0; i != '\0'; i ++) {
您需要测试的是i
(当前分析的字符索引)不指向空字符。该行应为:
for (i = 0; text[i] != '\0'; i ++) {
函数中的for
循环具有
for(i = 0; i != '\0'; ++i)
^^^^^^^^^
将其更改为:
for(i = 0; text[i] != '\0'; ++i)
因为您想检查文本[i]
何时具有NUL
字符。0
和'\0'
,在for循环的上下文(和许多其他上下文)中是相同的
for(i = 0; i != '\0'; ++i)
我把它理解为:“因为我从零开始,而它与零不同……”这实际上意味着循环甚至不会运行一次。这行for(I=0;I!='\0'
是不正确的。'\0'
是0
。它应该是for(I=0;text[I]!='\0'
。而不是scanf;
,您应该使用fgets(text,sizeof(text),stdin)
为了安全起见…它保证读取的文本不超过大小,防止潜在的内存错误…这是一个好习惯,黑客利用这些错误进行攻击。@JohnH谢谢你的建议。它实际上解决了我代码中的另一个问题(当插入空格时程序停止)。显然,循环将无限运行。@volerag:它不会运行。不会运行一次,更不用说无限次了。我认为I
永远不会是\0
,这使得I!='\0'
为真,因此是无限的。赋值I=0
使其为零。然后比较I!='\0'
产生假…增量从未执行我可能是错的,但0!='\0'
为真,对吗?零不等于空字符?真。