该程序应该采用两个字符串并在循环期间逐个合并每个元素。例如,如果我有
第一个字符串为: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';
}
答案 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;
}