首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Strchr和strncpy的误用

Strchr和strncpy的误用
EN

Stack Overflow用户
提问于 2011-07-08 03:31:41
回答 4查看 720关注 0票数 0

您好,我正在尝试查找- char,然后将最左边的字符放入一个字符串中。这里我希望FUPOPER存储在program_id_DB中,但是当我运行这段代码时,我的输出结果是:

代码语言:javascript
复制
Character '-' found at position 8.

prgmid包含FUPOPERL <-它从哪里获得这个l?!?!

代码语言:javascript
复制
char data_DB[]="FUPOPER-$DSMSCM.OPER*.FUP";

char program_id_DB[10];

char program_name_DB_c[ZSYS_VAL_LEN_FILENAME];

char *pos = strchr(data_DB, '-');

if (pos)
     strncpy(program_id_DB,data_DB, pos-data_DB);


 printf("Character '-' found at position %d.\n",  pos-data_DB+1);

 printf("The prgmid contains %s\n",program_id_DB);
EN

回答 4

Stack Overflow用户

发布于 2011-07-08 03:36:21

您没有初始化program_id_DB,所以它可以自由地包含它想要的任何内容。在开始之前将其设置为零:

代码语言:javascript
复制
memset(program_id_DB, 0, 10);

(您需要为memset使用#include <string.h>。)

实际上,您所做的是非常危险的,因为不能保证您传递给printf的字符串是以null结尾的!始终在使用前将数组置零,并将最多9个非空字符复制到其中。

票数 1
EN

Stack Overflow用户

发布于 2011-07-08 03:36:23

您需要放置一个\0来标记字符串的末尾。

一种方法是:在strncpy到它之前先执行memset(program_id_DB, 0, sizeof(program_id_DB));

票数 0
EN

Stack Overflow用户

发布于 2011-07-08 03:37:01

您必须在program_id_DB字符串的末尾附加一个空终止字符,因为如果您已经复制了N个字符,strncpy不会自动执行此操作(即,在本例中,您总共复制了8个字符,因此如果您复制的字符超过7个,则不会有空终止字符被复制到缓冲区中)。或者在将program-id_DB字符串与strncpy一起使用之前,使用memset将其初始化为零。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6616036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档