为什么strcat会给我str1的版本?据我所知,必须有&函数原型和实现中的paramatater之前的事情,如果你想编辑它,但我不会在这里看到它。
char *strcat( char *str1, const char *str2 );
如何编辑此函数以便它只返回新字符串但忽略我给它的字符串? 我的尝试
char *strApp(char *dest, const char *src)
{
size_t i,j;
size_t k = 0;
for (i = 0; dest[i] != '\0'; i++);
char rdest[100];
do {
rdest[k] = dest[k];
} while(++k<=i);
for (j = 0; src[j] != '\0'; j++)
rdest[i+j] = src[j];
rdest[i+j] = '\0';
return rdest;
}
它损坏了第二根弦。谁能给我安全正确的版本?提前谢谢。
答案 0 :(得分:2)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *strApp(const char *s1, const char *s2)
{
char *pointer = malloc(strlen(s1) + strlen(s2) + 1);
if (pointer == NULL)
{
perror("failed to allocate memory");
exit(EXIT_FAILURE);
}
return strcat(strcpy(pointer, s1), s2);
}
int main()
{
char *s1 = "original";
char *s2 = " modified";
char *s3 = strApp(s1, s2);
printf("%s\n", s1);
printf("%s\n", s2);
printf("%s\n", s3);
free(s3);
return 0;
}
只是想指出你不需要完全重写strcat()
来获得你想要的东西。
答案 1 :(得分:0)
答案 2 :(得分:0)
您已使用C和C ++标记了您的问题。我正在提供C解决方案。 C ++可能需要进行调整。
#include <stdlib.h>
#include <string.h>
char* strdupcat(const char* s1, const char* s2) {
size_t s1_len = strlen(s1);
size_t s2_len = strlen(s2);
char* s = malloc(s1_len + s2_len + 1);
if (s == NULL)
return NULL;
{
char* s_end = s;
s_end = mempcpy(s_end, s1, s1_len);
s_end = mempcpy(s_end, s2, s2_len);
*s_end = '\0';
}
return s;
}
使用示例:
#include <stdio.h>
int main() {
char* s = strdupcat("abc", "def");
if (s == NULL) {
perror("Can't concatenate");
return EXIT_FAILURE;
}
puts(s);
free(s);
return EXIT_SUCCESS;
}
此功能与strdup
类似。
<强>描述强>
strdupcat()
函数返回指向新字符串的指针,该字符串是字符串s1
的副本,附加了字符串s2
的副本。使用malloc
(3)获取新字符串的内存,可以使用free
(3)释放。返回值
strdupcat()
函数返回指向重复字符串的指针,如果内存不足,则返回NULL
。<强>错误强>
ENOMEM
内存不足,无法分配新字符串。
strerror
返回perror
时,您可以使用strdupcat()
或NULL
获取错误消息。
这是一个接受任意数量参数的版本:
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
char* strdupcatmany(int dummy, ...) {
#define strdupcatmany(...) strdupcatmany(0, __VA_ARGS__, NULL)
size_t len = 0;
char* s;
char* s_dst;
const char* s_src;
va_list ap;
va_start(ap, dummy);
while (1) {
s_src = va_arg(ap, const char*);
if (s_src == NULL)
break;
len += strlen(s_src);
}
va_end(ap);
s = malloc(len + 1);
if (s == NULL)
return NULL;
s_dst = s;
va_start(ap, dummy);
while (1) {
s_src = va_arg(ap, const char*);
if (s_src == NULL)
break;
s_dst = stpcpy(s_dst, s_src);
}
va_end(ap);
*s_dst = '\0';
return s;
}
例如,
#include <stdio.h>
int main() {
char* s = strdupcatmany("abc", "def", "ghi");
if (s == NULL) {
perror("Can't concatenate");
return EXIT_FAILURE;
}
puts(s);
free(s);
return EXIT_SUCCESS;
}
注意:我不知道如何移植__VA_ARGS__
args。