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

#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进行处理就全乱套了 求问这个函数哪里有问题?

阅读 4.2k
4 个回答

锵锵~
恭喜你遇到了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);
main.c:6:9: warning: implicitly declaring library function 'strlen' with type 'unsigned long (const char *)' [-Wimplicit-function-declaration]
  int k=strlen(shu);
        ^
main.c:6:9: note: include the header <string.h> or explicitly provide a declaration for 'strlen'
main.c:10:7: warning: implicitly declaring library function 'strncpy' with type 'char *(char *, const char *, unsigned long)' [-Wimplicit-function-declaration]
      strncpy(shu1,shu+i+1,k-i-1);
      ^
main.c:10:7: note: include the header <string.h> or explicitly provide a declaration for 'strncpy'

你加 #include <string.h> 后再试试..

后面有 $, 你加个 \n 就可以

printf("%s\n",shu1);

你的 shu1 没有初始化。你需要先把它的内容清零(用 memset),或者记得加字符串结束符。

另外,你的编译器没有告诉你用 gets 是件很危险的事情么?

补个结束符试试

strncpy(shu1,shu+i+1,k-i-1);
shu1[k-i-1] = '\0';
printf("%s",shu1);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进