2016-10-27 2 views
-1

Это упражнение, чтобы научить себя c в 21дней.Я хочу спросить мой неудачный код

Вопрос: Напишите функцию, которая принимает две строки. Используйте функцию malloc(), чтобы выделить достаточно памяти, чтобы удерживать две строки после их конкатенации. Верните указатель на эту новую строку.

Итак, я сделал первый код. но не работает. Функция в коде следующая:

char *concate(char *p, char *q) 
{ 
    int i, len; 
    char *r; 

    if((r = (char *)malloc(100)) == NULL){ 
     printf("Allocate failed\n"); 
     exit(1); 
    } 


    r = p; 
    for(i = 0; r[i] != '\0'; ++i) 
      ; 
    len = i; 
    for(i = 0; q[i] != '\0'; ++i, ++len) 
     r[len] = q[i]; 

    return r; 
} 

Ошибка компиляции, кроме ошибки времени выполнения.

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

Но я понятия не имею, использую следующую проблему с решением проблемы.

char *concate(char *p, char *q) 
{ 
    int i, len; 
    char *r; 

    if((r = (char *)malloc(1000)) == NULL){ 
     exit(1); 
    } 

    for (i = 0; p[i] != '\0'; ++i) 
     r[i] = p[i]; 

    len = i; 

    for(i = 0; q[i] != '\0'; ++i, ++len) 
     r[len] = q[i]; 

    r[len] = '\0'; 


    return r; 
} 

Этот код может работать, и может потребоваться результат.

Мой вопрос: как я могу использовать только переменную-указатель get result?

Я хочу использовать *p, *q, *r и арифметику указателя и некоторую переменную (i для цикла).

Я решил проблему, но чувствую себя не очень хорошо, потому что я использую массив, чтобы решить эту проблему.

Пожалуйста, помогите! Спасибо.

*** Я спросил, как использовать переменную указателя только для выражения (решения) выше.

+0

О, извините. в main() аргументы для функции - String. – antil

+2

Вам нужно изучить 'strlen',' strcpy', нулевое завершение строк ... изучить строки в целом. – Lundin

+0

'malloc (strlen (p) + strlen (q) + 1)' –

ответ

2

Во-первых, вам выделяют память 100 как случайное значение, надеясь, что этого достаточно. Это лучший подход, чтобы найти длину каждой строки и выделить память для комбинированной длины.

Во-вторых, вы перезаписать указатель на выделенную память с помощью r = p; Вам нужно использовать strcpy, чтобы скопировать строку из r в p.

Вот решение, используя только указатели

char *concate(char *p, char *q) 
{ 
    int i, len=0, ; 
    char *r, *temp; 

    temp = p; 
    for(; *temp ; ++temp) 
      len++; 
    temp = q;   
    for(; *temp ; ++temp) 
      len++; 

    if((r = malloc(len+1)) == NULL){ 
     printf("Allocate failed\n"); 
     exit(1); 
    } 

    for (temp = r; *p; p++, temp++) 
     *temp = *p; 

    for (; *q; q++, temp++) 
     *temp = *q; 

    *temp = '\0'; 

    return r; 
} 
+0

спасибо! может решить эту проблему, используйте только указатель! – antil

+0

Да. Если я изучил функцию strcpy, тогда не нужно писать так. – antil

0

Проблема заключается в том, что вы перезаписать адрес, возвращаемый malloc в

if((r = (char *)malloc(100)) == NULL){ 
    printf("Allocate failed\n"); 
    exit(1); 
} 
r = p; /* Memory leak */ 

В результате у вас нет места для хранения результата, изменение в

strcpy(r, p); 
+0

Благодарим за ответ. но я пока не изучаю strcpy. (После изучения главы). – antil

+0

Затем реализуйте свой собственный 'strcpy' с помощью цикла:' while ((* r ++ = * p ++)); ', не забудьте перемотать' r' и 'p' после цикла. –

0

Может быть ниже ответ, что вы ищете.

char *concate(char *p, char *q) 
{ 
    char *res = p; 

    while (*p) 
     *p++; 

    *p--; 

    while (*q) 
    { 
     *p++; 
     *p = *q; 
     *q++; 
    } 
    *++p = *q; 

    return res; 
} 

Мы можем оптимизировать его больше. Сообщите мне, если я пропустил что-то

+0

благодарю вас за ответ! – antil

+0

Нам нужно выделить память для сохранения результата. Я думаю, объявляю * res и инициализирую p, а затем недостаточно, чтобы сохранить результат. Я иду домой, чтобы проверить ваш ответ. Спасибо за помощь! – antil

+0

По моему мнению, нет необходимости выделять память для * res (если мы не выполняем strcpy, просто перераспределите память * p с длиной * p и * q) –

Смежные вопросы