C语言指针初学者 请帮我看看下面的提 为啥调用函数返回值是char型的 这样不就只能返回一个字符了吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针初学者 请帮我看看下面的提 为啥调用函数返回值是char型的 这样不就只能返回一个字符了吗相关的知识,希望对你有一定的参考价值。
题目描述
读入一个实数,输出该实数的小数部分,小数部分若多余的末尾0,请去掉。如输入111111.12345678912345678900
则输出0.123456789123456789。若去掉末尾0之后小数部分为0,则输出“No decimal part”。注意该实数的位数不超过100位。
请定义并使用如下函数。
char *decimal(char *p)
将字符串p表示的实数的自小数点开始的小数部分存入一个字符串,并由函数返回,若p为“123.456”,则返回的字符串为“.456”。若小数部分为0,返回空指针NULL。
输入
输入一个实数。不超过100位。
输出
输出小数部分,输出占一行。
样例输入
111111.12345678900012345678900
样例输出
0.123456789000123456789
提示
来源
返回值不是char类型,而是指向char类型的指针
这样做的目的在于,由于各个数字变量类型存在表示值的上限,所以把小数当成字符串来处理,这样就不会受表示值上限的限制,比如你输入一个100位的小数,不管你用double还是用float类型,都表示不了,只能用字符串的形式来处理
#include "stdio.h"#include "string.h"
#include "stdlib.h"
char *decimal(char *p)
int total_length=strlen(p);
char *point=NULL,*out=NULL;
int out_length=0;
//去末尾的0
while(1)
if(*(p+total_length-1)!='0')
break;
*(p+total_length-1)='\\0';
total_length--;
//没有小数点,也就没有了小数部分,返回NULL
if((point=strchr(p,'.'))==NULL)
return NULL;
//有小数点,但是是最后一位,说明小数部分也是0,返回NULL
else if(*(p+total_length-1)=='.')
return NULL;
//这种情况下,说明有小数部分
else
out_length=total_length-(point-p);
out=(char *)malloc(out_length+1);
memset(out,0,out_length+1);
strncpy(out,point,out_length);
memset(p,0,total_length);
strncpy(p,out,out_length);
free(out);
out=NULL;
return p;
int main()
char p[200]=0;
char *q=NULL;
printf("请输入一个小于100位的小数:\\n");
gets(p);
if((q=decimal(p))!=NULL)
printf("0");
puts(q);
else
printf("No decimal part\\n");
结果:
追问基本上能看懂 请解释下有小数部分情况下中的语句好吗 不大明白
还有那个while(1) 在很多情况下见到 但是不知道到底是什么条件
我改成 while(*p!='\0') p--可以吗 能讲下吗
while(1)
是个死循环
条件一直是成立的
所以需要你自己设立条件来break;
while(1)
//如果字符串最后一个字符不是'0'了,说明字符串末尾的'0',清完了,就可以中止循环了
if(*(p+total_length-1)!='0')
break;
//如果最后一个是'0',那就换成'\0'空字符,
*(p+total_length-1)='\0';
//空字符的话,字符串长度肯定就小1了。
total_length--;
这块的目的就是从字符串的最后一个字符开始反向找,看有没有'0',有的话,就换成空字符'\0'
如果最后一个不是'0'
了,那我们去掉末尾的'0'字符的目的就达到了
所以就中止这个循环了。
有小数时的情况 :
strchr的作用就是找一个字符串,某个特定字符的位置,我们肯定是找小数点'.'的位置
找到位置就从这个位置把小数部分复制出来。
out_length=total_length-(point-p);//小数字符串的长度
out=(char *)malloc(out_length+1);//临时动态申请内存来存小数
memset(out,0,out_length+1);//先把临时空间清0
strncpy(out,point,out_length);//把小数从p中复制到out中,point指向的是小数点的位置
memset(p,0,total_length);//把原字符串p清空
strncpy(p,out,out_length);//把已经存入临时空间的小数部分存回原字符串
free(out);//释放动态申请的内存,防止内存溢出
out=NULL;//指针设为空
return p;//现在p中存的就是小数部分了(小数点开头),返回
追问
返回的是一个指针的地址是吗 那要怎么样才能输出从返回的指针的地方输出后面的字符串呢 比如就那这道题来说
//////////////
字符串以\0为结束标注,遍历字符串直到遇见\0 参考技术B 你好,返回值是char*,也就是char型的指针,并不是char型的变量。char型的指针是指向一个字符串的某一个字符的地址,他就可以通过对这个指针的操作来访问这个字符串了。追问
返回的是一个指针的地址是吗 那要怎么样才能输出从返回的指针的地方输出后面的字符串呢 比如就那这道题来说
以上是关于C语言指针初学者 请帮我看看下面的提 为啥调用函数返回值是char型的 这样不就只能返回一个字符了吗的主要内容,如果未能解决你的问题,请参考以下文章
C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?