Strncpy добавить символ

Мне нужно изменить имя файла, передаваемого по аргументу, добавив «_out» и изменив расширение. Итак, сначала я копирую имя старого файла без расширения, вот так

  char* arg1 = argv[1];

  char* var1 = NULL;
  var1 = malloc(strlen(arg1) * sizeof(char));
  strcpy( var1, arg1 );
  var1[strlen(var1) - 1] = 'l';
  var1[strlen(var1) - 2] = 'm';
  var1[strlen(var1) - 3] = 'x';

  char* var1Out = NULL;
  var1Out = malloc((strlen(var1) + 4) * sizeof(char));

  strncpy( var1Out, var1, strlen(var1) - 4 ); //Marker


             .
             .
             .

Но когда я отображаю var1Out с помощью printf сразу после «//Marker», передавая «test.txt» в качестве аргумента, я получаю: «test└», и, наконец, моя программа возвращает «test└_out.xml». " в конце. В то время как, когда я изменяю линию маркера следующим образом:

strncpy( var1Out, var1, strlen(var1) - 3 ); //Marker

он отображает:

тест.

и с:

strncpy( var1Out, var1, strlen(var1) - 5 ); //Marker

он отображает:

те

так что работает отлично.

Почему он добавляет символ, когда я использую:

strncpy( var1Out, var1, strlen(var1) - 4 ); //Marker

?


person moth    schedule 12.08.2014    source источник
comment
Некоторое время в документации для каждого из эти строковые функции и точно то, что они делают, скорее всего, помогут. И мне любопытно, что, по вашему мнению, делает ваша программа, когда переданный параметр командной строки равен "x" (или любой другой строке короче, чем по крайней мере три символа). Будьте осторожны со своими предположениями. они могут вернуться, чтобы укусить вас.   -  person WhozCraig    schedule 12.08.2014


Ответы (2)


В распределении для var1 вам не хватает места для нулевого терминатора. Использовать

malloc(strlen(arg1) + 1)
person Wojtek Surowka    schedule 12.08.2014
comment
Извините, но я ошибся, это не работает. После изменения malloc(strlen(arg1)) на malloc(strlen(arg1) + 1) у меня такая же ошибка. Странно, потому что иногда этой ошибки нет, а иногда она есть. Идея, пожалуйста? спасибо - person moth; 14.08.2014
comment
Какой аргумент командной строки вы используете, когда видите ошибку? - person Wojtek Surowka; 14.08.2014
comment
Имя моей программы — Test, а имя моего файла — myFile.ext. В команде я запускаю Test myFile.ext. Но когда я отображаю var1Out, я получаю myFile8 или myFileM или любой другой случайный символ в конце myFile, а не просто myfile. - person moth; 14.08.2014
comment
Ваша последняя строка strncpy( var1Out, var1, strlen(var1) - 4 ); копирует указанное количество символов из var1 в var1Out, но не добавляет нулевой символ конца в конце. Таким образом, вы получите var1Out, содержащую строку, не заканчивающуюся нулем, и когда вы попытаетесь напечатать ее, вы получите случайные символы после скопированных символов или даже сбой. - person Wojtek Surowka; 14.08.2014
comment
Да, я узнал об этом, справедливо написал новый ответ, чтобы объяснить, как я решаю эту проблему с помощью этого решения. - person moth; 14.08.2014

копировать строку

Никакой нулевой символ неявно не добавляется в конце адресата, если источник длиннее num. Таким образом, в этом случае пункт назначения не должен считаться завершающейся нулем строкой C (чтение ее как таковой приведет к переполнению).
http://www.cplusplus.com/reference/cstring/strcpy/

Вот почему у меня был дополнительный символ в моей строке, потому что он не считается строкой C с завершающим нулем.

Итак, добавив в мой код:

  var1Out[strlen(var1)- 4] = '\0';

Оно работает.

person moth    schedule 14.08.2014