Давайте посмотрим на эти строки:
new_str[0] = '\0';
strcat(new_str,firstP);
new_str[strlen(firstP)] = '/';
strcat(new_str,secondP);
Перед записью строка выглядит так:
+---+---+---+---+---+---+---+---+
| ? | ? | ? | ? | ? | ? | ? | ? |
+---+---+---+---+---+---+---+---+
После первой строки (new_str[0] = '\0';
) у вас есть это:
+---+---+---+---+---+---+---+---+
| 0 | ? | ? | ? | ? | ? | ? | ? |
+---+---+---+---+---+---+---+---+
После второй строки (strcat(new_str,firstP);
) это выглядит так:
+---+---+---+---+---+---+---+---+
| A | B | C | D | 0 | ? | ? | ? |
+---+---+---+---+---+---+---+---+
Теперь, когда вы выполняете строку
new_str[strlen(firstP)] = '/';
вы перезаписываете нулевой терминатор и получаете следующее:
+---+---+---+---+---+---+---+---+
| A | B | C | D | / | ? | ? | ? |
+---+---+---+---+---+---+---+---+
Это проблема, потому что ваша строка больше не завершается нулем, поэтому, когда вы в следующий раз вызовете strcat
, программа начнет чтение в неинициализированную память в поисках нулевого терминатора.
Если вы хотите объединить строки вместе, может быть проще просто использовать sprintf
, например так:
sprintf(new_str, "%s/%s", firstP, secondP);
Это более явно говорит «напишите первую строку, затем разделитель, затем вторую строку» и переносит все управление нулевым терминатором в библиотеку. И библиотеки, за исключением strncat
, обычно довольно хорошо обрабатывают нулевые терминаторы. . :-)
Также есть шанс, что sprintf
может быть немного быстрее, чем то, что вы делаете. Использование большого количества strcat
подряд таким образом, как вы предлагаете, может быть неэффективным из-за накладные расходы на повторное сканирование строк для поиска завершающих нулей, но я бы не стал на это ставить. Однако у него есть очень явное преимущество, заключающееся в более точном сообщении того, что вы пытаетесь сделать, и выигрыш в удобочитаемости редко бывает плохим.
person
templatetypedef
schedule
13.10.2017
sprintf(new_str, "%s/%s", firstP, secondP);
вместо.new_str[strlen(firstP)] = '/';
перезаписывает последний нуль-терминатор строки. Таким образом, 2-йstrcat
не может найти конец правильной строки. - person BLUEPIXY   schedule 13.10.2017