sunnyrubik 发表于 2018-11-19 23:19:55

初学C语言指针遇到两个问题。

各位鱼友大家好,小弟刚刚跟着小甲鱼老师学习指针,这是网上的一个题目。

然后我写了以下代码
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
void change(char *s);
void insert(char *m);

int main()
{
        char ch;
        int i=0;
        char str;
        while((ch=getchar())!='\n')
        {
                str=ch;
                i++;
        }
        change(str);
        insert(str);
        printf("%s\n",str);
       
        system("pause");
        return 0;
}
void change(char *s)//明文中的字母转换成其后的第4个字母
{
        while(*s!='\0')
        {
                while(*s)
    {
      if(*s >= 'A' && *s <= 'V')
            *s=*s+4;
      else if(*s >= 'a' && *s <= 'v')
            *s=*s+4;
      else if(*s='w')*s='a';
      else if(*s='W')*s='A';
      else if(*s='x')*s='b';
      else if(*s='X')*s='B';
      else if(*s='y')*s='c';
      else if(*s='Y')*s='C';
      else if(*s='Z')*s='D';
      else if(*s='z')*s='d';
      s++;
    }
        }
}
void insert(char *m)//将密文每两个字符之间插入一个空格
{
        while(*m!='\0')
        {
                while(*m)
                {
                        printf("%c",*m);
                        printf(" ");
                        m++;
                }
        }
}
但是运行的结果有一下两个问题
1.它会将所有的数字转化为a。这不是题目要求的
2.在空格时会出现问题,详见下图。
请大家帮忙看看是什么原因

丶忘却的年少o 发表于 2018-11-19 23:19:56

本帖最后由 丶忘却的年少o 于 2018-11-20 10:24 编辑

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

#include "stdio.h"
#include <string.h>
#include <stdlib.h>

/* 传进来的是指针和字符串的长度 */
void change(char *str, int len)
{       
        for ( int i = 0; i < len; i++ )
        {
                // 外圈判断范围,内圈判断边界
                if ( str >= 'A' && str <= 'Z' )
                {
                        if ( str <= 'V' )
                                str = str + 4;
                        else
                                str = str - 22;
                }
                else if ( str >= 'a' && str <= 'z' )
                {
                        if (str <= 'v')
                                str = str + 4;
                        else
                                str = str - 22;
                }

        }
}

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

        for ( ; i < len; i++ )
        {
                temp = str;
                temp = ' ';
        }

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

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

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

        int len = strlen(str);
        change(str, len);
        insert(str, len);
        printf("%s\n",str);

        system("pause");

        return 0;
}

sunnyrubik 发表于 2018-11-20 16:18:29

本帖最后由 sunnyrubik 于 2018-11-20 16:37 编辑

丶忘却的年少o 发表于 2018-11-19 23:19
1. change函数你的else if判断的条件不是比较,是赋值,你将“==”写成了“=”,所以不管里面是什么都变了 ...

非常感谢您的解答

KAKUI丶 发表于 2018-11-20 17:28:24

看了你的,然后扫了一眼楼上的代码,比较难看,然后自己再写了下,觉得比你们的都简单易懂整洁,代码如下
#include<stdio.h>
#include<string.h>

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

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

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

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

sunnyrubik 发表于 2018-11-20 17:34:16

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

谢谢大佬{:5_110:}

KAKUI丶 发表于 2018-11-20 17:36:07

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

第一次用鱼C论坛的,不会发图片,验证过的,代码正常,只要长度不要超过40就行,另外字母溢出的需求没有写明白,我就当作是循环的一个字母表输出

KAKUI丶 发表于 2018-11-20 17:38:03

卧槽,我就回帖慢那么一会,居然采纳别人的

sunnyrubik 发表于 2018-11-20 17:44:39

KAKUI丶 发表于 2018-11-20 17:38
卧槽,我就回帖慢那么一会,居然采纳别人的

那个哥子是今天上午回复我的哈。另外谢谢你的解答哈(发代码是点那个尖括号哈)
页: [1]
查看完整版本: 初学C语言指针遇到两个问题。