#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)