2015-10-10 3 views
-1

Эта программа должна принимать две строки и объединять каждый элемент один за другим во время цикла. Например, если у меня есть
первой строка, как: hlowrd
и второй строки, как: Эль-ол
окончательная строка должна быть привет мир

Однако, когда вторая строка длиннее, чем первый будет отрезать остальные символы. Я считаю, что это связано с тем, что я структурировал цикл for в функции comb, но я не уверен, как подойти к его исправлению.C Программа - объединить 2 строки во время цикла

#include <stdio.h> 
#include <string.h> 

#define N 50 

int read_text(char *str, int n); 
void combine(char *s3, const char *s1, const char *s2); 

int main(void) 
{ 
    char string1[N+1]; 
    char string2[N+1]; 
    char string3[N+1]; 
    printf("Enter: \n"); 
    read_text(string1, N); 
    printf("Enter: \n"); 
    read_text(string2, N); 
    combine(string3, string1, string2); 
    printf("New string is: %s\n", string3); 
    return 0; 
} 

int read_text(char *str, int n) 
{ 
    int ch, i = 0; 

    while ((ch = getchar()) != '\n') { 
     if (i < n) { 
      *str++ = ch; 
      i++; 
     } 
    } 
    *str = '\0'; 
    return i; 
} 

void combine(char *s3, const char *s1, const char *s2) 
{ 
    const char *s; 
    s = s1; 

    for(s = s3; *s1 != '\0'; s++) { 
     strcpy(s3++, s1++); 
     strcpy(s3++, s2++); 
    } 
    *s3 = '\0'; 
} 

ответ

1

Вы в настоящее время останавливаетесь только в конце первой строки. Вы хотите остановиться в конце более короткой строки, а затем добавить остаток от более длинного.

Изменить условия в вашем for цикле быть

for (;*s1 != '\0' && *s2 != '\0';) {...} 

(или просто изменить его на while петли, так как вам не нужно переменную s так или иначе):

while (*s1 != '\0' && *s2 != '\0') {...} 

в остановитесь, когда на конце самой короткой струны и, после петли, добавьте

if (*s1 == '\0') 
    strcpy(s3, s2); 
else if (*s2 == '\0') 
    strcpy(s3, s1); 

, чтобы объединить оставшуюся часть длинной строки с выходом.

1

Вы должны зацикливаться на том, что оставшаяся строка источника не является пустой, но также вы не можете использовать strcpy, поскольку вы выполняете слияние char-by-char. Попробуйте следующее:

void 
combine(char *s3,const char *s1,const char *s2) 
{ 
    int c1; 
    int c2; 

    c1 = *s1; 
    c2 = *s2; 

    while ((c1 != 0) || (c2 != 0)) { 
     if (c1 != 0) { 
      *s3++ = c1; 
      c1 = *++s1; 
     } 

     if (c2 != 0) { 
      *s3++ = c2; 
      c2 = *++s2; 
     } 
    } 

    *s3 = 0; 
} 
+0

'strcpy' действительно работает, хотя и немного (хорошо, много) неэффективно внутри цикла. Я тестировал код с ним, и он отлично работает. – owacoder

+0

@owacoder Это ответ [который я знал до публикации]. Не используя strcpy, он чище, проще (!) И является _practical_ ответом, к которому вы должны стремиться. Для меня [C в течение 30 + лет], strcpy - ошибка (потому что это путь далеко не оптимальный), и я бы написал отчет об ошибке. Просмотрите свой код и мой. Ваш код показал, что вы действительно не понимаете проблему/решение - это реальная проблема. wrench_can_ быть молотком - иногда. Но, mag на 1000x в реальной базе кода, и это нетривиально. Всегда сохраняйте код настолько простым, насколько это необходимо [и не проще]. Кроме того, проверьте эго на дверь ... –

+0

Я знаю полностью, откуда вы. Однако я не пытался использовать «ключ в качестве молотка». Мне жаль, если бы это получилось. Лично я бы не использовал код моего ответа на производстве. Тем не менее, она * решила проблему OP (на данный момент без особых изменений). Я ничего не имею против вашего метода и фактически буду защищать его. Мой ответ (и комментарий) был строго быстрым решением. В течение длительного времени исправить и улучшить, я определенно выберет ваш ответ. Я просто указывал в своем комментарии, что 'strcpy' в этом случае будет * работать *, но не обязательно * хорошо *. – owacoder

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