我需要编写一个程序,将两个字符串连接到第一个字符串。我不能使用第三个参数来保存新字符串。当我运行程序时,我没有输出,所以我很确定问题出在我的函数中,它连接了两个字符串。
#include <stdio.h>
#define MAX_SZ 81
int concatString(char s1[], char s2[]); // concatenates s2 onto s1, returns length of s1
int getString(char c[], int len);
main(void)
{
char array1[MAX_SZ * 2];
char array2[MAX_SZ];
int string1 = 0;
int string2 = 0;
int concat = 0;
printf("Please String # 1 up to 80 characters long:\n");
string1 = getString(array1, MAX_SZ);
printf("Please enter String #2 up to 80 characters long:\n");
string2 = getString(array2, MAX_SZ);
concat = concatString(array1, array2);
printf("You entered \"%s\" (length = %i)\n", array1, concat);
return 0;
}
int getString(char c[], int len)
{
int i = 0;
char d = 0;
while (d != '\n' && i < len)
{
d = getchar();
c[i++] = d;
}
c[--i] = '\0';
return (i);
}
int concatString(char s1[], char s2[])
{
int i, j;
for (i = 0; s1 != '\0'; ++i)
s1[i] = s1[i];
for (j = i; s2 != '\0'; ++j)
s1[j] = s2[j];
s1 [i + j] = '\0';
return (i + j);
}
答案 0 :(得分:2)
问题在于以下几点:
for (j = i; s2 != '\0'; ++j)
s1[j] = s2[j];
此处j
不为零,因此您开始在s2
中以非零索引编制索引,甚至可能超出范围。
但那只是一个问题。第二个问题是循环的条件,它将永远为假,导致无限循环。
第一个循环与循环条件有相同的问题。
至于为什么循环条件错误,字符'\0'
等于零,大多数系统也等于NULL
。所以你有效地检查是否例如s1 != NULL
。由于两个字符串都是编译时数组,因此传递给函数的指针永远不会出现空指针。
答案 1 :(得分:0)
有一些问题,主要是for循环中的条件:
for (i = 0; s1 != '\0'; ++i)
除非字符串为null,否则永远不会成立。
你要放的是
for (i = 0; s1[i] != '\0'; ++i)
这将检查您正在查看的字符是否为空终止字符,这可能是您想要的。
第二个循环也是一个问题。
for (j = i; s2 != '\0'; ++j)
s1[j] = s2[j];
你在j开始s2而不是零
for (j = 0; s2[j] != '\0'; ++j)
s1[i + j] = s2[j];
这将引导您完成s2,将s2 [0]添加到s1 [i],其中s1 [i]是您上一个for循环中的空字符。然后你增加j,然后s1 [i + 1]变成s2 [1],依此类推。
<强>此外:强>
追加空字符可以(可能)完成:
for (j = 0; s2[j-1] != '\0'; ++j)
s1[i + j] = s2[j];
如果您知道s2之前的字符不为空,可以通过声明:
char array1[MAX_SZ * 2];
char placeholder = 0xff
char array2[MAX_SZ];
如果这没有意义,也要忽略它并按照你之前的方式追加null char