Strchr и strncpy Злоупотребление - PullRequest
0 голосов
/ 07 июля 2011

Привет, я пытаюсь найти символ - и затем поместить самые левые символы в строку. Здесь я хотел бы, чтобы FUPOPER был сохранен в program_id_DB, однако, когда я запускаю этот код, мой вывод приводит к:

Character '-' found at position 8.

prgmid содержит FUPOPERL <- где он получает это l?!?! </p>

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 ]

1 голос
/ 07 июля 2011

Вы не инициализировали program_id_DB, поэтому он может содержать все, что захочет.Установите его в ноль, прежде чем начать:

memset(program_id_DB, 0, 10);

(Вам необходимо #include <string.h> для memset.)

На самом деле то, что вы делаете, ужасно опасно, потому что нетгарантируйте, что строка, которую вы передаете printf, заканчивается нулем!Всегда обнуляйте массив перед использованием и копируйте в него не более 9 ненулевых символов.

0 голосов
/ 07 июля 2011

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 */
0 голосов
/ 07 июля 2011

Вы должны добавить заканчивающийся нулем символ в конце строки program_id_DB, так как strncpy не делает это автоматически для вас, если вы уже скопировали N символов (т.е. в вашем случае вы копируетевсего восемь символов, поэтому в буфер не будет скопирован символ с нулем в конце, если вы скопируете более семи символов).Либо так, либо инициализируйте ноль вашу program-id_DB строку, используя memset, прежде чем использовать ее с strncpy.

0 голосов
/ 07 июля 2011

Вам нужно поставить \0, чтобы отметить конец строки.

Способ сделать это: memset(program_id_DB, 0, sizeof(program_id_DB)); перед вами strncpy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...