我将在第2部分中学习使用基本上与内存和字符串有关的语言。我想在C中制作一个类似于strcat()
的函数,所以这是我到目前为止的内容:
#include <stdio.h>
#include <string.h>
char *add_str(char *str, char *str2);
int main() {
char name[] = "MatthewGamer"; char name2[] = "PlayGames";
printf("%s\n", add_str(name, name2));
}
char *add_str(char str[], char str2[]) {
return strcat(str, str2);
}
不是说我想更改函数内部的内容,而是在字符串连接后出现问题。当我运行程序时,出现的是这样:
~/BPML/C/Phase2/ $ make add_str
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow add_str.c -lcrypt -lcs50 -lm -o add_str
~/BPML/C/Phase2/ $ ./add_str
MatthewGamerPlayGames
Segmentation fault
~/BPML/C/Phase2/ $
是的,分割错误是随后出现的错误。即使我以前已经遇到过其中一种情况,我也不了解其背后的机制。
问:如果字符串中的代码有问题,如何解决?如果不是字符串,那该怎么办?
答案 0 :(得分:1)
因为您的目标字符串太短,并且strcat在数组边界之外突出。您需要为两个字符串留出空间。
<div class="title-split">Hello there</div>
答案 1 :(得分:1)
strcat
要求目标数组具有一个已为null终止的字符串 ,并且具有额外的空间来容纳整个串联的字符串和终止符,否则,行为将为未定义。
最可扩展的解决方案是使用strlen
,malloc
和memcpy
而不是完全使用strcat
:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *concatenate(const char *s1, const char *s2) {
size_t s1_len = strlen(s1);
size_t s2_len = strlen(s2);
char *ret = malloc(s1_len + s2_len + 1);
memcpy(ret, s1, s1_len);
// copy the null terminator too
memcpy(ret + s1_len, s2, s2_len + 1);
return ret;
}
int main(void) {
char *concatenated = concatenate("Hello ", "World!");
printf("%s\n", concatenate);
free(concatenated);
}