C程序 - 在循环期间组合2个字符串

时间:2015-10-10 21:13:11

标签: c string for-loop merge

该程序应该采用两个字符串并在循环期间逐个合并每个元素。例如,如果我有         
第一个字符串为:hlowrd
和         第二个字符串为:el ol
最终的字符串应该是hello world

但是,当第二个字符串比第一个字符串长时,它将切断剩余的字符。我相信它与我在函数组合中构造我的for循环有关,但是我不确定如何修复它。

#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';
}

2 个答案:

答案 0 :(得分:1)

您目前只在第一个字符串结尾处停止。你想在较短的字符串的末尾停止,然后从较长的字符串中添加余数。

tr -s '[:blank:]' '\n' < rawtext.txt | fgrep -vwf stopwords.txt 循环中的条件更改为

for

(或者只是将其更改为for (;*s1 != '\0' && *s2 != '\0';) {...} 循环,因为您无论如何都不需要变量while

s

在最短字符串结束时停止,并在循环之后添加

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

将较长字符串的其余部分连接到输出。

答案 1 :(得分: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;
}