c - 为什么我想截取小数的文本部分提示乱码?

查看:59
本文介绍了c - 为什么我想截取小数的文本部分提示乱码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

int main(void)
{char shu[200],shu1[200];
     gets(shu);     int k=strlen(shu);

for(int i=0;shu[i]!='\0';i++)
     {
         if(shu[i]=='.')
         {   
            strncpy(shu1,shu+i+1,k-i-1);
             printf("%s",shu1);
            return 0;
         }
         }
return 0;
}


这个是输进去一个实数 把他的小数部分截出来的函数 但是偶尔会出乱码比方说输进去6.1就会出乱码 shu1显示是1后面还有个$ 再对shu1进行处理就全乱套了 求问这个函数哪里有问题?

解决方案

锵锵~
恭喜你遇到了strncpy怪异行为!
strncpy有两个违反直觉的地方。
char *strncpy(char *dest, const char *src, int n)
1.当src的实际长度(不含结束符)等于或大于n时,strncpy仍然会拷贝n个字符,不会追加结束符。
2.当src的实际长度小于n时,strncpy除了会拷贝其内容后,还会填充\0直到总数满n个为止。
所以你应该拷贝以后,再手动添加一个\0在最后一个字节(注意要判断一下,小心超了数组)
VC++的话可以直接用strncpy_s,它就没有那么神经病了,能保证一定会有结束符。BSD等系统有strlcpy可以用。Linux的话Do it yourself

另外其实这个问题你想得太复杂了,你只要输出就可以了,没有必要赋值到另外数组中去。
找到小数点,然后从下一个字符直接打印就可以了。
char *dot = strchr(str1, ".");
if (dot != NULL)

printf("%s", dot + 1);

这篇关于c - 为什么我想截取小数的文本部分提示乱码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆