Как вернуть строку символов в другую функцию?

Я нажимаю функцию, которая накладывает несколько символов вправо или влево в зависимости от выбора пользователя. Я использовал функцию strcat для согласования символов с строкой, и она отлично работала в случае правильного заполнения, но в то время как я оставил заполнение, я получил ненужные символы, поэтому я написал свою собственную функцию concat. Тем не менее тот же результат можно найти в приведенном ниже коде.

char *concat(char a[], char b[])
{
    int len1=0, len2=0, i, j;
    char tmp[100], *tmp2;
    trace("concat(): Begin");
    len1 = strlen(a);
    len2 = strlen(b);
    for(i=0, j=0; i<(len1+len2); i++)
    {
        if(i

Обратите внимание, что вышеуказанная программа работает в полном порядке в случае правильного заполнения.

Пожалуйста, дайте мне знать, что я делаю неправильно, из-за чего, когда я оставляю заполнение, в конце отображаются мусорные символы.

Note: The functions and variable whose reference is not there in the program are declared globally in my program like the function "trace" and the variable "pd". trace() function takes a string parameter and writes that string to a file.

0
nl ja de
Исправьте отступ, это невозможно прочитать.
добавлено автор Lundin, источник
возможный дубликат C: Возврат строки из функции
добавлено автор netcoder, источник
Вы следили/наблюдали за ним в отладчике, чтобы узнать, что/когда/где проблема начинается?
добавлено автор ChiefTwoPencils, источник

3 ответы

Вы возвращаете указатель на временную переменную стека, которая выходит за пределы области действия, когда функция завершается. Его память может (будет) повторно использоваться другими вызовами функций. Самым простым решением было бы динамически распределять память в concat , а затем free в вызывающем.

char* tmp = malloc(len1+len2+1);

Вы также можете упростить функцию concat , чтобы

char* tmp = malloc(len1+len2+1);
strcpy(tmp, a);
strcat(tmp, b);
return tmp;
2
добавлено
Рад, что у вас это работает. Боюсь, я не совсем понимаю ваш вопрос. strcat ищет нулевой ограничитель в строке dest и добавляет строку src в этот момент. Если у вас была достаточно большая строка dest, которая начиналась с ваших байтов заполнения, вы можете использовать strcat (dest, src)
добавлено автор simonc, источник
Благодарю. Он работал, но я не понимаю, почему strcat не работает, когда я использую его для левой прокладки, пока он работает в правом дополнении.
добавлено автор Manas, источник
  1. Вам не следует писать собственную версию strcat.
  2. Вы не должны возвращать автоматический (локальный) массив - он выходит из области видимости после возвращения функции, используя ее, вызывает неопределенное поведение.

Либо malloc() потребляет некоторую память и возвращает динамически выделенный фрагмент или память, либо вызывает функции с аргументом ввода/вывода, который является массивом, объявленным в вызывающем ( в отличие от вызываемого).

2
добавлено
Содержимое стека обычно не изменяется путем возврата из функции. Значение теряется только при повторном использовании стека для совершения второго вызова.
добавлено автор h22, источник
@ AudriusMeškauskas Не спекулируйте. UB - UB.
добавлено автор user529758, источник

Вы выделяете результат, который вы возвращаете в стек внутри возвращаемой функции:

char tmp[100]

Это может даже на самом деле работать (содержимое обычного, «классического» стека не прерывается возвратом), но только до тех пор, пока вы используете или копируете возвращенную строку немедленно в другое место, не делая другого вызова. Как только вы совершаете второй вызов (включая системный вызов), стек повторно используется, и вы получаете мусор.

Присвоение ссылки на другую переменную перед возвратом не влияет.

Используйте одну из функций семейства strdup для возврата клонированной копии (не забудьте освободить, когда больше не понадобится).

1
добавлено