初学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-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:37 编辑
丶忘却的年少o 发表于 2018-11-19 23:19
1. change函数你的else if判断的条件不是比较,是赋值,你将“==”写成了“=”,所以不管里面是什么都变了 ...
非常感谢您的解答
看了你的,然后扫了一眼楼上的代码,比较难看,然后自己再写了下,觉得比你们的都简单易懂整洁,代码如下
#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);
}
} KAKUI丶 发表于 2018-11-20 17:28
看了你的,然后扫了一眼楼上的代码,比较难看,然后自己再写了下,觉得比你们的都简单易懂整洁,代码如下
...
谢谢大佬{:5_110:} KAKUI丶 发表于 2018-11-20 17:28
看了你的,然后扫了一眼楼上的代码,比较难看,然后自己再写了下,觉得比你们的都简单易懂整洁,代码如下
...
第一次用鱼C论坛的,不会发图片,验证过的,代码正常,只要长度不要超过40就行,另外字母溢出的需求没有写明白,我就当作是循环的一个字母表输出 卧槽,我就回帖慢那么一会,居然采纳别人的 KAKUI丶 发表于 2018-11-20 17:38
卧槽,我就回帖慢那么一会,居然采纳别人的
那个哥子是今天上午回复我的哈。另外谢谢你的解答哈(发代码是点那个尖括号哈)
页:
[1]