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中存的就是小数部分了(小数点开头),返回

参考技术A 返回值不是char型 是char*的 返回字符串

追问
返回的是一个指针的地址是吗 那要怎么样才能输出从返回的指针的地方输出后面的字符串呢 比如就那这道题来说

//////////////
字符串以\0为结束标注,遍历字符串直到遇见\0
参考技术B 你好,返回值是char*,也就是char型的指针,并不是char型的变量。char型的指针是指向一个字符串的某一个字符的地址,他就可以通过对这个指针的操作来访问这个字符串了。追问

返回的是一个指针的地址是吗 那要怎么样才能输出从返回的指针的地方输出后面的字符串呢 比如就那这道题来说

以上是关于C语言指针初学者 请帮我看看下面的提 为啥调用函数返回值是char型的 这样不就只能返回一个字符了吗的主要内容,如果未能解决你的问题,请参考以下文章

请帮我看看这段javascript函数错在哪里

c语言 如何打印函数指针名

C语言中关于结构体指针为啥不能在函数内赋初值的问题?

C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?

帮介绍一下C语言里的varargs。

c语言问题。我编的。初学函数。略懂指针。编了以下程序不知错在哪里。求高手帮忙