C 将两个字符串连接到一个字符串时出现问题

C 将两个字符串连接到一个字符串时出现问题,c,C,我需要编写一个程序,将两个字符串连接到第一个字符串中。我不能使用第三个参数来保存新字符串。当我运行程序时,我没有得到任何输出,所以我很确定问题出在连接两个字符串的函数中 #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

我需要编写一个程序,将两个字符串连接到第一个字符串中。我不能使用第三个参数来保存新字符串。当我运行程序时,我没有得到任何输出,所以我很确定问题出在连接两个字符串的函数中

#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);
}
#包括
#定义MAX_SZ 81
int concatString(字符s1[],字符s2[]);//将s2连接到s1,返回s1的长度
int getString(字符c[],int len);
主(空)
{
字符阵列1[MAX_SZ*2];
chararray2[MAX_SZ];
int string1=0;
int string2=0;
int concat=0;
printf(“请输入长度不超过80个字符的字符串:\n”);
string1=getString(数组1,MAX_SZ);
printf(“请输入长度不超过80个字符的字符串:\n”);
string2=getString(array2,MAX_SZ);
concat=concat字符串(array1,array2);
printf(“您输入了\%s\”(长度=%i)\n),数组1,concat);
返回0;
}
int getString(字符c[],int len)
{
int i=0;
chard=0;
而(d!='\n'&&i
问题出在以下几行:

for (j = i; s2 != '\0'; ++j)
  s1[j] = s2[j];
这里的
j
不是零,因此您可以在
s2
中以非零索引开始索引,甚至可能超出范围

但这只是一个问题。第二个问题是循环的条件,它永远不会导致无限循环

第一个循环与循环条件有相同的问题


至于循环条件错误的原因,字符
'\0'
等于零,在大多数系统上也等于
NULL
。因此,您可以有效地检查例如
s1!=空
。由于两个字符串都是编译时数组,因此传递给函数的指针永远不会为空指针。

问题在于以下几行:

for (j = i; s2 != '\0'; ++j)
  s1[j] = s2[j];
这里的
j
不是零,因此您可以在
s2
中以非零索引开始索引,甚至可能超出范围

但这只是一个问题。第二个问题是循环的条件,它永远不会导致无限循环

第一个循环与循环条件有相同的问题


至于循环条件错误的原因,字符
'\0'
等于零,在大多数系统上也等于
NULL
。因此,您可以有效地检查例如
s1!=空
。由于两个字符串都是编译时数组,因此传递给函数的指针永远不会为空指针。

存在一些问题,主要是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开始的,不是从零开始的

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];

如果这没有意义,也可以忽略它,并像以前那样附加空字符。有几个问题,主要是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开始的,不是从零开始的

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];

如果这样做没有意义,也可以忽略它,并按照之前的方式附加空字符

s1!='\0'
的含义与您认为的不同。看起来你想要
s1[i]!='\0'
。与s2类似。两者之间的区别是什么?他们看起来一样。我正在尝试运行循环,直到循环最后到达\0字符。您的循环不依赖于迭代变量
I
,这一事实应该是一个很大的危险信号。不同之处在于,您的将指针
s1
与“\0”进行比较,而我的将比较数组中
s1
指向的一个字符。
s1
是指向
char
的指针,
s1[i]
是字符串中的一个字符。
s1!='\0'
的含义与您认为的不同。看起来你想要
s1[i]!='\0'
。与s2类似。两者之间的区别是什么?他们看起来一样。我正在尝试运行循环,直到循环最后到达\0字符。您的循环不依赖于迭代变量
I
,这一事实应该是一个很大的危险信号。不同之处在于,您的将指针
s1
与“\0”进行比较,而我的将比较数组中
s1
指向的一个字符。
s1
是指向
char
的指针,
s1[i]
是字符串中的一个字符。