Функция не распечатывает результат - PullRequest
2 голосов
/ 25 марта 2012

Я должен сделать функцию, которая объединяет две строки, но я должен добавить '\ n' после первого слова.Я все понял и по какой-то причине ничего не распечатал.Есть идеи?Вероятно, это связано с указателями.Я просто не могу понять их.Вот код:

char *function(char *s1, char *s2){
    char *newStr;
    int size;
    size = strlen(s1) + strlen(s2);

    newStr = (char *)malloc((size+1)*sizeof(char));

    while(*s1!= '\0'){
        *newStr = *s1;
        newStr++;
        s1++;
    }
    *newStr = '\n';
    newStr++;
    while(*s2 != '\0'){
        *newStr = *s2;
        newStr++;
        s2++;
    }
    *newStr = '\0';
return newStr;
}

int main (int argc, const char * argv[]) {
    char *str1 = "Hello";
    char *str2 = "World";

    printf("%s",function(str1, str2));

     return 0;
}

В результате я должен получить:

Hello
World

, но я ничего не получаю обратно.

Ответы [ 4 ]

4 голосов
/ 25 марта 2012

Вы возвращаете указатель на конец буфера, а не указатель на начало буфера.Посмотрите на последние две строки функции:

*newStr = '\0';
return newStr;

Очевидно, что это возвращает указатель на ноль char, то есть пустую строку.

Решите проблему, введя временный указателькоторый вы будете использовать, чтобы пройти через выходной буфер.Затем вы можете вернуть указатель на начало буфера вывода.

char *function(char *s1, char *s2){
    int size = strlen(s1) + strlen(s2) + 2;//one for '\n', one for '\0'
    char *result = malloc(size);
    char *p = result;

    while(*s1 != '\0'){
        *p = *s1;
        p++;
        s1++;
    }
    *p = '\n';
    p++;
    while(*s2 != '\0'){
        *p = *s2;
        p++;
        s2++;
    }
    *p = '\0';

    return result;
}

Вам также необходимо выделить дополнительный символ для \n, как показано выше.Наконец, ваш вызывающий код никогда не освобождает память, выделенную function.

0 голосов
/ 25 марта 2012

Я отладил код для вас. Вот отлаженный код:

char *function(char *s1, char *s2) {
    char *newStr, *str;
    int size;
    size = strlen(s1) + strlen(s2);

    newStr = (char *) malloc((size + 2) * sizeof(char));
    str = newStr;
    while (*s1 != '\0') {
        *(newStr++) = *(s1++);
    }
    *newStr = '\n';
    newStr++;
    while (*s2 != '\0') {
        *newStr = *s2;
        newStr++;
        s2++;
    }
    *newStr = '\0';
    return str;
}

int main(int argc, const char *argv[]) {
    char *str1 = "Hello";
    char *str2 = "World";

    printf("%s", function(str1, str2));

    return 0;
}

Реальная проблема заключалась в том, что при увеличении newStr до последнего, когда вы возвращали его из function(), оно указывало на конец буфера. то есть '\0'. Вот почему он не появился. Теперь в приведенном выше коде я ввел переменную str, которая указывает на начало строки newStr.

Надеюсь, вы поняли ..

Мир ...

0 голосов
/ 25 марта 2012

Вы возвращаете из function() указатель на последний элемент в выделенном char[] - вместо возврата указателя на первый элемент.

Каждый раз, когда вы делаете newStr++;, вы увеличиваете фактический указательВы позже вернетесь.чтобы решить ее, вы можете сделать одно из следующих действий:

  1. создать копию указателя newStr, которая инициализируется так же, как newStr, и увеличить его - оставить newStr как этоis.
  2. создайте индекс [пусть он будет i] и увеличьте его, и используйте newStr[i] для доступа к выделенному массиву.
0 голосов
/ 25 марта 2012

Я бы взглянул на две вещи:

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