凯撒';C中的s密码

凯撒';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!

我正在尝试做一个程序,接收一个字符数组作为输入,每个字母被另一个字母替换。在下面的代码中,我只考虑一个更改(‘a’->‘h’),但是一旦程序为该更改工作,我将实现其他(基于例如凯撒密码)。 问题是,程序编译成功,但是,当我运行它时,如果我插入一个“a”,他会返回另一个“a”(它应该返回一个“h”)。 代码有什么问题? 提前谢谢

#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'
为真,对吗?零不等于空字符?真。