鱼C论坛

 找回密码
 立即注册
查看: 1327|回复: 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 编辑

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


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

  2. main(void)
  3. {
  4.         char s[256]                                                                                 ;
  5.         int n                                                                                       ;
  6.         for(n = 0 ; n < 255 && (s[n] = getchar()) != '\n'; n ++) {
  7.                 if(s[n] >= 'A' && s[n] <= 'Z' || s[n] >= 'a' && s[n] <= 'z') {
  8.                         s[n] += 4                                                                   ;
  9.                         if(s[n] > 'Z' && s[n] < 'Z' + 5 || s[n] > 'z' && s[n] < 'z' + 5) s[n] -= 26 ;
  10.                 }
  11.         }
  12.         s[n] = '\0'                                                                                 ;
  13.         printf("%s\n" , s)                                                                          ;
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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


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

  2. main(void)
  3. {
  4.         char s[256]                                                                                 ;
  5.         int n                                                                                       ;
  6.         for(n = 0 ; n < 255 && (s[n] = getchar()) != '\n'; n ++) {
  7.                 if(s[n] >= 'A' && s[n] <= 'Z' || s[n] >= 'a' && s[n] <= 'z') {
  8.                         s[n] += 4                                                                   ;
  9.                         if(s[n] > 'Z' && s[n] < 'Z' + 5 || s[n] > 'z' && s[n] < 'z' + 5) s[n] -= 26 ;
  10.                 }
  11.         }
  12.         s[n] = '\0'                                                                                 ;
  13.         printf("%s\n" , s)                                                                          ;
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. int main(void)
  3. {
  4.         char a[20];
  5.         int i,n;
  6.         printf("你想输入几位数的密码:");
  7.         scanf("%d\n",&n);
  8.         for(i=0;i<n;i++)
  9.         {
  10.                 scanf("%c",&a[i]);
  11.         }
  12.         printf("%s\n",a);
  13.         for(i=0;i<n;i++)
  14.         {
  15.                 if((('A'<=a[i])&&(a[i]<='V'))||(('a'<=a[i])&&(a[i]<='v')))
  16.                 {
  17.                         a[i]=a[i]+4;
  18.                 }
  19.                 if((('W'<=a[i])&&(a[i]<='Z'))||(('w'<=a[i])&&(a[i]<='z')))
  20.                 {
  21.                         a[i]=a[i]-22;
  22.                 }
  23.         }
  24.         printf("%s",a);
  25.       
  26. }
复制代码

没看你的判断条件,只是修改了一些感觉不合适的地方
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. int main(void)
  3. {
  4.         char a[20];
  5.         int i;
  6.         for (i = 0;i <= 20;i++)
  7.         {
  8.                 scanf("%c", &a[i]);   // 错误!a 是数组名,是地址
  9.                 if (a[i] == '\n')     // 错误!a 是数组名,是地址
  10.                 break;
  11.         }
  12.         a[i] = '\0';              // 添加结束符
  13.         printf("%s\n", a);
  14.         for (i = 0;a[i] != '\0';i++)
  15.         {
  16.                 if ((('A' <= a[i]) && (a[i] <= 'V')) || (('a' <= a[i]) && (a[i] <= 'v')))   // 错误!a 是数组名,是地址
  17.                 {
  18.                         a[i] = a[i] + 4;   // 错误!a 是数组名,是地址
  19.                 }
  20.                 if ((('W' <= a[i]) && (a[i] <= 'Z')) || (('w' <= a[i]) && (a[i] <= 'z')))   // 错误!a 是数组名,是地址
  21.                 {
  22.                         a[i] = a[i] - 22;   // 错误!a 是数组名,是地址
  23.                 }
  24.         }
  25.         printf("%s\n", a);

  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

明白了,手段添加字符串结束标识符,今天研究了一下,也可以直接用gets函数,更方便些
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

现在好了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个我打的时候是有方括号的,发表就没了,应该是文本输入的原因,我还不知道怎么输入你们代码格式的,我研究一下哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. int main(void)
  3. {
  4.         char a[20];
  5.         int i;
  6.         printf("请输入你需要的破译的密码:");
  7.         gets(a);
  8.         for(i=0;a[i]!='\0';i++)//输入字符串结尾会自动添加结束标识符“\0”
  9.         {
  10.                 if((('A'<=a[i])&&(a[i]<='V'))||(('a'<=a[i])&&(a[i]<='v')))
  11.                 {
  12.                         a[i]=a[i]+4;
  13.                 }
  14.                 if((('W'<=a[i])&&(a[i]<='Z'))||(('w'<=a[i])&&(a[i]<='z')))
  15.                 {
  16.                         a[i]=a[i]-22;
  17.                 }
  18.         }
  19.                 printf("%s\n",a);
  20. }
复制代码

直接使用gets()函数简便多了,而且scanf()还不能输入空格.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-3 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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