您好我试图找到 - 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);
答案 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_DB
对memset
字符串进行零初始化,然后再将其与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 */