我想编写一个在C中进行字符串连接的函数。同时,我想使用指针来实现这一点。我在这里写了这段代码:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
char* concat(char* a, char* b) { //функция конкатенации
char* c = (char*) malloc(sizeof(char)*(strlen(a)+strlen(b)+1)); //выделение памяти для новой строки
for (int i = 0; i < strlen(a); i++){ //задать первым символам результатирующей строки символы первой строки
c[i] = a[i];
}
for (int i = strlen(a); i < strlen(a)+strlen(b); i++){//задать следующим символам результатирующей строки символы второй строки
c[i] = b[i];
}
c[strlen(a)+strlen(b)] = '\0'; //добавить нулевой символ
return c;
}
int main(){ //проверка
char* a = concat("Hello, ", "world!");
for (int i = 0; i < strlen(a); i++){ //распечатка
printf("%c", a[i]);
}
free(a); //освобождение памяти
return 0;
}
但不幸的是,它并没有按照应有的方式工作。它输出:
Hello, Hello,
如何使其不重复第一行,而是粘合两个不同的行?
让我们看看这个:
会发生什么?您正在从字符串中获取字符
b,但作为第一个字符,您将获取位于等于字符串长度的索引处的字符a,而不是第一个字符b。事实上,在这种情况下,你上线a(它的重复)只是一个意外,UB。这是一种选择
这是另一个
但像这样重写整个函数会更容易:
const虽然在 C 中是可选的,但它是可取的(您不更改输入字符串),在 C++ 中将结果强制转换malloc为类型char*,但在 C 中则不然,好吧,sizeof(char)根据定义它等于 1 ...好吧,最重要的是 - 不要忘记释放分配的内存......