开发者

Strchr and strncpy Misuse

开发者 https://www.devze.com 2023-03-18 22:07 出处:网络
Hi im trying to find the - char and then place the leftmost characters into a string. Here i would like FUPOPER to be stored in program_id_DB, however when i run this code my output results to:

Hi im trying to find the - char and then place the leftmost characters into a string. Here i would like FUPOPER to be stored in program_id_DB, however when i run this code my output results to:

Character '-' found at position 8.

The prgmid contains FUPOPERL <-where is it getting this l?!?!

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_i开发者_如何学JAVAd_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);


You didn't initialize program_id_DB, so it's free to contain anything it wants. Set it to zero before you start:

memset(program_id_DB, 0, 10);

(You need to #include <string.h> for memset.)

In fact, what you're doing is terribly dangerous because there's no guarantee that the string you pass to printf is null-terminated! Always zero the array before use and copy at most 9 non-null characters into it.


You need to put a \0 to mark the string's end.

A way to do it is: memset(program_id_DB, 0, sizeof(program_id_DB)); before you strncpy to it.


You have to append a null-terminating character at the end of the program_id_DB string as strncpy does not do this automatically for you if you've already copied N characters (i.e., in your case you're copying a total of eight characters, so there will not be a null-terminating character copied into the buffer if you copy more than seven characters). Either that, or zero-initialize your program-id_DB string using memset before using it with strncpy.


strncpy is a bitch!

It doesn't terminate the string. You need to terminate the string yourself.

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

And if the string is too small, strncpy will set the remainder with zeros.

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

精彩评论

暂无评论...
验证码 换一张
取 消