Strchr和strncpy误用

时间:2011-07-07 19:31:41

标签: c

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

Character '-' found at position 8.

prgmid包含FUPOPERL< - 它在哪里得到这个??!?!

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

4 个答案:

答案 0 :(得分:1)

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

memset(program_id_DB, 0, 10);

#include <string.h>需要memset。)

事实上,你正在做的事情非常危险,因为无法保证你传递给printf的字符串是空终止的!在使用之前始终将数组归零,并将最多9个非空字符复制到其中。

答案 1 :(得分:0)

您需要设置\0来标记字符串的结尾。

执行此操作的方法是:memset(program_id_DB, 0, sizeof(program_id_DB));之前strncpy

答案 2 :(得分:0)

你必须在program_id_DB字符串的末尾附加一个空终止字符,因为如果你已经复制了N个字符,strncpy不会自动为你执行此操作(例如,在你的情况下)您正在复制总共八个字符,因此如果复制超过七个字符,则不会将空终止字符复制到缓冲区中。或者,或者使用program-id_DBmemset字符串进行零初始化,然后再将其与strncpy一起使用。

答案 3 :(得分:0)

strncpy是个婊子!

它不会终止字符串。你需要自己终止字符串。

if (pos) {
    strncpy(program_id_DB,data_DB, pos-data_DB);
    program_id_DB[pos - data_DB] = 0;
}

如果字符串太小,strncpy会将余数设置为零。

strncpy(dst, src, 1000); /* always writes 1000 bytes, whether it needs to */