鱼C论坛

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

[已解决]初学C语言指针遇到两个问题。

[复制链接]
发表于 2018-11-19 23:19:55 | 显示全部楼层 |阅读模式
5鱼币
各位鱼友大家好,小弟刚刚跟着小甲鱼老师学习指针,这是网上的一个题目。
屏幕截图(56).png
然后我写了以下代码
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<ctype.h>
  4. void change(char *s);
  5. void insert(char *m);

  6. int main()
  7. {
  8.         char ch;
  9.         int i=0;
  10.         char str[100];
  11.         while((ch=getchar())!='\n')
  12.         {
  13.                 str[i]=ch;
  14.                 i++;
  15.         }
  16.         change(str);
  17.         insert(str);
  18.         printf("%s\n",str);
  19.        
  20.         system("pause");
  21.         return 0;
  22. }
  23. void change(char *s)//明文中的字母转换成其后的第4个字母
  24. {
  25.         while(*s!='\0')
  26.         {
  27.                 while(*s)
  28.     {
  29.         if(*s >= 'A' && *s <= 'V')
  30.             *s=*s+4;
  31.         else if(*s >= 'a' && *s <= 'v')
  32.             *s=*s+4;
  33.         else if(*s='w')*s='a';
  34.         else if(*s='W')*s='A';
  35.         else if(*s='x')*s='b';
  36.         else if(*s='X')*s='B';
  37.         else if(*s='y')*s='c';
  38.         else if(*s='Y')*s='C';
  39.         else if(*s='Z')*s='D';
  40.         else if(*s='z')*s='d';
  41.         s++;
  42.     }
  43.         }
  44. }
  45. void insert(char *m)//将密文每两个字符之间插入一个空格
  46. {
  47.         while(*m!='\0')
  48.         {
  49.                 while(*m)
  50.                 {
  51.                         printf("%c",*m);
  52.                         printf(" ");
  53.                         m++;
  54.                 }
  55.         }
  56. }
复制代码

但是运行的结果有一下两个问题
1.它会将所有的数字转化为a。这不是题目要求的
2.在空格时会出现问题,详见下图。
请大家帮忙看看是什么原因

屏幕截图(57).png 屏幕截图(58).png
最佳答案
2018-11-19 23:19:56
本帖最后由 丶忘却的年少o 于 2018-11-20 10:24 编辑

1. change函数你的else if判断的条件不是比较,是赋值,你将“==”写成了“=”,所以不管里面是什么都变了。
2. 就是change内的函数操作不当引起的。
我写一个我的代码,你可以参考下,优化下你的代码。(只是个人理解)

  1. #include "stdio.h"
  2. #include <string.h>
  3. #include <stdlib.h>

  4. /* 传进来的是指针和字符串的长度 */
  5. void change(char *str, int len)
  6. {       
  7.         for ( int i = 0; i < len; i++ )
  8.         {
  9.                 // 外圈判断范围,内圈判断边界
  10.                 if ( str[i] >= 'A' && str[i] <= 'Z' )
  11.                 {
  12.                         if ( str[i] <= 'V' )
  13.                                 str[i] = str[i] + 4;
  14.                         else
  15.                                 str[i] = str[i] - 22;
  16.                 }
  17.                 else if ( str[i] >= 'a' && str[i] <= 'z' )
  18.                 {
  19.                         if (str[i] <= 'v')
  20.                                 str[i] = str[i] + 4;
  21.                         else
  22.                                 str[i] = str[i] - 22;
  23.                 }

  24.         }
  25. }

  26. /* 我感觉是在这个函数内添加空格,不是打印,所以我这里
  27.    传进指针,生成有空格的字符串副本再拷贝给自己 */
  28. void insert(char *str, int len)
  29. {
  30.         char temp[40] = {0};                // 这个数组最好大一点,防止越界
  31.         int i = 0;

  32.         for ( ; i < len; i++ )
  33.         {
  34.                 temp[2*i] = str[i];
  35.                 temp[2*i+1] = ' ';
  36.         }

  37.         strcpy_s(str, 40, temp);                // 把处理好的字符串给写回去
  38. }

  39. /* 函数加_s的是VS编译器的安全函数,加了操作字符串的长度
  40.    不是VS编译器的可以不考虑,但是要自己注意边界 */
  41. int main()
  42. {
  43.         char str[40] = {0};                // 直接就给初始化,让里面所有元素都为'\0'

  44.         printf("请输入语句: ");
  45.         scanf_s("%s", str, 20);       

  46.         int len = strlen(str);
  47.         change(str, len);
  48.         insert(str, len);
  49.         printf("%s\n",str);

  50.         system("pause");

  51.         return 0;
  52. }

复制代码

最佳答案

查看完整内容

1. change函数你的else if判断的条件不是比较,是赋值,你将“==”写成了“=”,所以不管里面是什么都变了。 2. 就是change内的函数操作不当引起的。 我写一个我的代码,你可以参考下,优化下你的代码。(只是个人理解)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-11-19 23:19:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 丶忘却的年少o 于 2018-11-20 10:24 编辑

1. change函数你的else if判断的条件不是比较,是赋值,你将“==”写成了“=”,所以不管里面是什么都变了。
2. 就是change内的函数操作不当引起的。
我写一个我的代码,你可以参考下,优化下你的代码。(只是个人理解)

  1. #include "stdio.h"
  2. #include <string.h>
  3. #include <stdlib.h>

  4. /* 传进来的是指针和字符串的长度 */
  5. void change(char *str, int len)
  6. {       
  7.         for ( int i = 0; i < len; i++ )
  8.         {
  9.                 // 外圈判断范围,内圈判断边界
  10.                 if ( str[i] >= 'A' && str[i] <= 'Z' )
  11.                 {
  12.                         if ( str[i] <= 'V' )
  13.                                 str[i] = str[i] + 4;
  14.                         else
  15.                                 str[i] = str[i] - 22;
  16.                 }
  17.                 else if ( str[i] >= 'a' && str[i] <= 'z' )
  18.                 {
  19.                         if (str[i] <= 'v')
  20.                                 str[i] = str[i] + 4;
  21.                         else
  22.                                 str[i] = str[i] - 22;
  23.                 }

  24.         }
  25. }

  26. /* 我感觉是在这个函数内添加空格,不是打印,所以我这里
  27.    传进指针,生成有空格的字符串副本再拷贝给自己 */
  28. void insert(char *str, int len)
  29. {
  30.         char temp[40] = {0};                // 这个数组最好大一点,防止越界
  31.         int i = 0;

  32.         for ( ; i < len; i++ )
  33.         {
  34.                 temp[2*i] = str[i];
  35.                 temp[2*i+1] = ' ';
  36.         }

  37.         strcpy_s(str, 40, temp);                // 把处理好的字符串给写回去
  38. }

  39. /* 函数加_s的是VS编译器的安全函数,加了操作字符串的长度
  40.    不是VS编译器的可以不考虑,但是要自己注意边界 */
  41. int main()
  42. {
  43.         char str[40] = {0};                // 直接就给初始化,让里面所有元素都为'\0'

  44.         printf("请输入语句: ");
  45.         scanf_s("%s", str, 20);       

  46.         int len = strlen(str);
  47.         change(str, len);
  48.         insert(str, len);
  49.         printf("%s\n",str);

  50.         system("pause");

  51.         return 0;
  52. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-11-20 16:18:29 | 显示全部楼层
本帖最后由 sunnyrubik 于 2018-11-20 16:37 编辑
丶忘却的年少o 发表于 2018-11-19 23:19
1. change函数你的else if判断的条件不是比较,是赋值,你将“==”写成了“=”,所以不管里面是什么都变了 ...


非常感谢您的解答
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-11-20 17:28:24 | 显示全部楼层
看了你的,然后扫了一眼楼上的代码,比较难看,然后自己再写了下,觉得比你们的都简单易懂整洁,代码如下
#include<stdio.h>
#include<string.h>

void change(char *s);
void insert(char *s);

int main()
{
        char str[40] = {0};
        char ch;
        printf("请输入密语:");
        scanf("%s",&str);
        change(str);
        insert(str);
}

void change(char *s)
{
        int i=0;
        while(s[i]!='\0')
        {
                if((s[i]>='a' && s[i]<='v') || (s[i]>='A' && s[i]<='V'))
                {
                        s[i]+=4;
                }
                else if((s[i]>='w' && s[i]<='z') || (s[i]>='W' && s[i]<='Z'))
                {
                        s[i]-=22;
                }
                i++;
        }
}

void insert(char *s)
{
        int i;
        for(i=0;i<=strlen(s);i++)
        {
                printf("%c ",s[i]);
        }
}

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
sunnyrubik + 2 + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-11-20 17:34:16 | 显示全部楼层
KAKUI丶 发表于 2018-11-20 17:28
看了你的,然后扫了一眼楼上的代码,比较难看,然后自己再写了下,觉得比你们的都简单易懂整洁,代码如下
...

谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-11-20 17:36:07 | 显示全部楼层
KAKUI丶 发表于 2018-11-20 17:28
看了你的,然后扫了一眼楼上的代码,比较难看,然后自己再写了下,觉得比你们的都简单易懂整洁,代码如下
...

第一次用鱼C论坛的,不会发图片,验证过的,代码正常,只要长度不要超过40就行,另外字母溢出的需求没有写明白,我就当作是循环的一个字母表输出
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-11-20 17:38:03 | 显示全部楼层
卧槽,我就回帖慢那么一会,居然采纳别人的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-11-20 17:44:39 | 显示全部楼层
KAKUI丶 发表于 2018-11-20 17:38
卧槽,我就回帖慢那么一会,居然采纳别人的


那个哥子是今天上午回复我的哈。另外谢谢你的解答哈(发代码是点那个尖括号哈)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 02:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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