鱼C论坛

 找回密码
 立即注册
查看: 1178|回复: 7

[已解决]#c语言#

[复制链接]
发表于 2021-1-6 16:05:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 MeowMoo 于 2021-1-6 17:23 编辑

大佬们帮忙,程序功能是A(a)-V(v)译为 E(e)-Z(z),WXYZ(wxyz)译为ABCD(abcd);运行结果正确但是会有乱码,应该是因为数组未定义部分的问题,那怎样把数组未定义的数省略不赋值,去掉乱码?
程序如下

#include <stdio.h>

int main(void)
{
        char a[20];
        int i;
        for(i=0;i<=20;i++)
        {
                scanf("%c",&a[i]);
                if(a[i]=='\n')
                        break;
        }
        printf("%s\n",a);
        for(i=0;a[i]!='\n';i++)
        {
                if((('A'<=a[i])&&(a[i]<='V'))||(('a'<=a[i])&&(a[i]<='v')))
                {
                        a[i]=a[i]+4;
                }
                if((('W'<=a[i])&&(a[i]<='Z'))||(('w'<=a[i])&&(a[i]<='z')))
                {
                        a[i]=a[i]-22;
                }
        }
        printf("%s\n",a);
       
}

运行结果如下

qwert
qwert
烫烫烫烫烫烫烫烫烫啲陎
uaivb
烫烫烫烫烫烫烫烫烫啲陎
请按任意键继续. . .
最佳答案
2021-1-6 16:37:14
本帖最后由 jackz007 于 2021-1-6 17:12 编辑

        字符串末尾没有结束标志
        for(i = 0 ; i < 19 ; i ++)     // i 只能小于 19,不可以等于 20,因为下标索引 19 的位置必须预留出来用于保存字符串结束标志字符 '\0'
        {
                scanf("%c" , & a[i])   ;
                if(a[i] == '\n') break ;
        }
        a[i] = '\0'                    ; // 添加此句

        下面是我写的代码,谨供楼主参考
#include <stdio.h>

main(void)
{
        char s[256]                                                                                 ;
        int n                                                                                       ;
        for(n = 0 ; n < 255 && (s[n] = getchar()) != '\n'; n ++) {
                if(s[n] >= 'A' && s[n] <= 'Z' || s[n] >= 'a' && s[n] <= 'z') {
                        s[n] += 4                                                                   ;
                        if(s[n] > 'Z' && s[n] < 'Z' + 5 || s[n] > 'z' && s[n] < 'z' + 5) s[n] -= 26 ;
                } 
        }
        s[n] = '\0'                                                                                 ;
        printf("%s\n" , s)                                                                          ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-6 16:37:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-6 17:12 编辑

        字符串末尾没有结束标志
        for(i = 0 ; i < 19 ; i ++)     // i 只能小于 19,不可以等于 20,因为下标索引 19 的位置必须预留出来用于保存字符串结束标志字符 '\0'
        {
                scanf("%c" , & a[i])   ;
                if(a[i] == '\n') break ;
        }
        a[i] = '\0'                    ; // 添加此句

        下面是我写的代码,谨供楼主参考
#include <stdio.h>

main(void)
{
        char s[256]                                                                                 ;
        int n                                                                                       ;
        for(n = 0 ; n < 255 && (s[n] = getchar()) != '\n'; n ++) {
                if(s[n] >= 'A' && s[n] <= 'Z' || s[n] >= 'a' && s[n] <= 'z') {
                        s[n] += 4                                                                   ;
                        if(s[n] > 'Z' && s[n] < 'Z' + 5 || s[n] > 'z' && s[n] < 'z' + 5) s[n] -= 26 ;
                } 
        }
        s[n] = '\0'                                                                                 ;
        printf("%s\n" , s)                                                                          ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 16:50:15 | 显示全部楼层
本帖最后由 心驰神往 于 2021-1-6 17:09 编辑
#include <stdio.h>

int main(void)
{
        char a[20];
        int i,n;
        printf("你想输入几位数的密码:");
        scanf("%d\n",&n);
        for(i=0;i<n;i++)
        {
                scanf("%c",&a[i]);
        }
        printf("%s\n",a);
        for(i=0;i<n;i++)
        {
                if((('A'<=a[i])&&(a[i]<='V'))||(('a'<=a[i])&&(a[i]<='v')))
                {
                        a[i]=a[i]+4;
                }
                if((('W'<=a[i])&&(a[i]<='Z'))||(('w'<=a[i])&&(a[i]<='z')))
                {
                        a[i]=a[i]-22;
                }
        }
        printf("%s",a);
       
}
没看你的判断条件,只是修改了一些感觉不合适的地方
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 19:50:15 | 显示全部楼层
#include <stdio.h>

int main(void)
{
        char a[20];
        int i;
        for (i = 0;i <= 20;i++)
        {
                scanf("%c", &a[i]);   // 错误!a 是数组名,是地址
                if (a[i] == '\n')     // 错误!a 是数组名,是地址
                break;
        }
        a[i] = '\0';              // 添加结束符
        printf("%s\n", a);
        for (i = 0;a[i] != '\0';i++)
        {
                if ((('A' <= a[i]) && (a[i] <= 'V')) || (('a' <= a[i]) && (a[i] <= 'v')))   // 错误!a 是数组名,是地址
                {
                        a[i] = a[i] + 4;   // 错误!a 是数组名,是地址
                }
                if ((('W' <= a[i]) && (a[i] <= 'Z')) || (('w' <= a[i]) && (a[i] <= 'z')))   // 错误!a 是数组名,是地址
                {
                        a[i] = a[i] - 22;   // 错误!a 是数组名,是地址
                }
        }
        printf("%s\n", a);

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-7 13:37:01 | 显示全部楼层
jackz007 发表于 2021-1-6 16:37
字符串末尾没有结束标志

明白了,手段添加字符串结束标识符,今天研究了一下,也可以直接用gets函数,更方便些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-7 13:40:01 | 显示全部楼层
心驰神往 发表于 2021-1-6 16:50
没看你的判断条件,只是修改了一些感觉不合适的地方

现在好了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-7 13:42:20 | 显示全部楼层

这个我打的时候是有方括号的,发表就没了,应该是文本输入的原因,我还不知道怎么输入你们代码格式的,我研究一下哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-7 13:46:24 | 显示全部楼层
#include <stdio.h>

int main(void)
{
        char a[20];
        int i;
        printf("请输入你需要的破译的密码:");
        gets(a);
        for(i=0;a[i]!='\0';i++)//输入字符串结尾会自动添加结束标识符“\0”
        {
                if((('A'<=a[i])&&(a[i]<='V'))||(('a'<=a[i])&&(a[i]<='v')))
                {
                        a[i]=a[i]+4;
                }
                if((('W'<=a[i])&&(a[i]<='Z'))||(('w'<=a[i])&&(a[i]<='z')))
                {
                        a[i]=a[i]-22;
                }
        }
                printf("%s\n",a);
}
直接使用gets()函数简便多了,而且scanf()还不能输入空格.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表