C 将字符串中的一个字母替换为另一个字母

C 将字符串中的一个字母替换为另一个字母,c,C,因此,在我完全学习C语言后,我将制作一个程序,将用户的密码保存在他们的计算机(本地)中,但将密码保存在本地是危险的,因为知道密码保存在哪里的人可以很容易地获得密码。我正在编写一个编码器,用特定的字母替换每个字母。(例如:'a'变成'1'),所以我在ideone.com上尝试了这个代码:(因为我不是在电脑附近,而是在智能手机附近) #包括 int main(){ 字符输入; scanf(“%c”,&input); 编码(输入); printf(“%c”,输入); 返回0; } 无效编码(字符输入)

因此,在我完全学习C语言后,我将制作一个程序,将用户的密码保存在他们的计算机(本地)中,但将密码保存在本地是危险的,因为知道密码保存在哪里的人可以很容易地获得密码。我正在编写一个编码器,用特定的字母替换每个字母。(例如:'a'变成'1'),所以我在ideone.com上尝试了这个代码:(因为我不是在电脑附近,而是在智能手机附近)

#包括
int main(){
字符输入;
scanf(“%c”,&input);
编码(输入);
printf(“%c”,输入);
返回0;
}
无效编码(字符输入){
字符a='a';
字符A='A';
a='1';
A='2';
}

如果我输入“aA”,它应该显示为“12”,但它当然只显示“a”,因为char只将第一个单词保存到变量中。我确实尝试在字符后使用[10],但我得到了错误,如果没有它,它只显示一个没有被替换的“a”。请尽快回答我。

您的
编码方法根本无效。按值传递。这永远不会影响变量输入。它将显示给您的输入


您必须发送字符变量的地址。阅读你的方法有两个大问题

  • 不要使用'void'将'int'用作'encode'返回类型。使用for循环将用户输入的所有值作为字符传递,并将返回的“int”值保存在“int”数组中。之后,您可以向用户显示该数组,说明密码已被编码或加密
  • 您没有在encode函数的任何地方使用“char input”,因此没有任何更改

  • 您需要扫描字符数组(使用%s和字符数组),然后根据映射循环替换字符。像这样:

    #include <stdio.h>
    
    /* Note we pass a pointer here, which gives access to the array... */
    void encode(char *input) 
    {
        int i;
    
        /* Loop through until we hit the end-of-string character */
        for (i=0; input[i] != '\0'; i++)
        {
            switch (input[i])
            {
                case 'a':
                    input[i] = '1';
                    break;
                case 'A':
                    input[i] = '2';
                    break;
    
                /* Add more mappings here, as required... */
    
                default:
                    break;
            }
        }
    }
    
    int main()
    {
        /* Make sure this is big enough for your string... */
        char input[10];
    
        scanf("%s", input);
        encode(input);
        printf("%s", input);
    
        return 0;
    }
    
    #包括
    /*注意,我们在这里传递一个指针,它允许访问数组*/
    无效编码(字符*输入)
    {
    int i;
    /*循环直到到达字符串的末尾*/
    对于(i=0;输入[i]!='\0';i++)
    {
    开关(输入[i])
    {
    案例“a”:
    输入[i]=“1”;
    打破
    案例“A”:
    输入[i]=“2”;
    打破
    /*根据需要在此处添加更多映射*/
    违约:
    打破
    }
    }
    }
    int main()
    {
    /*确保这个足够大,可以放你的绳子*/
    字符输入[10];
    扫描频率(“%s”,输入);
    编码(输入);
    printf(“%s”,输入);
    返回0;
    }
    

    请注意,这里的“开关”仅在您有几个特定映射时才有用。如果您想以更灵活的方式翻译字符,您可能需要对字符的值进行某种数学运算-这方面的事情取决于您

    “我完全学会了C”,真的吗?@alk如果你不知道我在说什么,我的英语很抱歉。你除了分配两个字符外,在编码方面什么都没做。如果删除main中的encode调用,将得到相同的结果。另一方面,
    printf(“%c”,…)
    打印出1个字符,这就是%c的含义。如果你想打印一系列字符(例如一个单词),你应该改用
    %s
    。另外:“请尽快回答我”在这里不会给你带来任何朋友!请注意,像您建议的那样的“单字母替换密码”非常弱,以至于在报纸上用于娱乐。作为密码的一种安全机制,它甚至没有注册为边缘安全。几乎不错。对于
    scanf()
    格式,我鼓励使用
    “%9s”
    ,尤其是当缓冲区只有10个字节时。你打算如何扩展开关以覆盖整个字母表?@JonathanLeffler:扩展它是OP的一个练习-这只是试图将它们指向正确的方向!我很高兴你能给他们指出正确的方向;我也是。我在质疑switch语句是否是正确的方向。我想不是你的最新编辑肯定更好。@JonathanLeffler:同意,谢谢你的建议-我更新了我的帖子,表明切换解决方案远不是很多映射的理想解决方案。我不是说我想要将字母转换为ASCII字母,而是要将specifif单词,就像“a”转换为“v”。
    #include <stdio.h>
    
    /* Note we pass a pointer here, which gives access to the array... */
    void encode(char *input) 
    {
        int i;
    
        /* Loop through until we hit the end-of-string character */
        for (i=0; input[i] != '\0'; i++)
        {
            switch (input[i])
            {
                case 'a':
                    input[i] = '1';
                    break;
                case 'A':
                    input[i] = '2';
                    break;
    
                /* Add more mappings here, as required... */
    
                default:
                    break;
            }
        }
    }
    
    int main()
    {
        /* Make sure this is big enough for your string... */
        char input[10];
    
        scanf("%s", input);
        encode(input);
        printf("%s", input);
    
        return 0;
    }