我想编写一个名为append()
的C函数,其目标是在给定字符串的末尾附加一个字符。但是,由于某些与指针相关的问题,我无法使我的代码正常工作。
#include <stdio.h>
void append(char ** string, int length, char ch)
{
printf("%s", string);
char * newString = (char *) malloc(sizeof(char)*(length+2));
strcpy(newString, string);
newString[length ] = ch;
newString[length + 1] = '\0';
strcpy(string, newString);
free(newString);
}
int main()
{
char * string = "my1name234is56";
append(string, strlen(string), 'x');
printf("%s", string);
}
在函数append()
中:strcpy()
之前的第二个free()
给了我一个例外,程序显示:
Unhandled exception at 0x5E8D40D9 (msvcr120d.dll) in mips_2_1.exe:
0xC0000005: Access violation writing location 0x00D1585C.
我也尝试过
strcpy(*string, newString);
和
strcpy(**string, newString);
而且似乎没有任何作用。
。
strcpy(&string, newString);
似乎可以正常工作,但是最终结果不是我所期望的。
编辑:我根据 alk 进行了编辑。
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void append(char ** string, int length, char ch)
{
printf("%s\n\n", *string);
char * newString = (char *)malloc(sizeof(char)*(length + 2));
strcpy_s(newString, length+1, *string);
newString[length] = ch;
newString[length + 1] = '\0';
strcpy_s(*string, length + 2, newString);
*string = newString;
}
int main(void)
{
char * string = "my1name234is56";
append(&string, strlen(string), 'x');
printf("%s", string);
}
它仍然无法正常工作。
Edit2 :我根据“ 风向标”进行了以下编辑:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
char * append(const char * string, int length, char ch)
{
char * newString = (char *)malloc(sizeof(char)*(length + 5));
printf("%s\n\n", string);
strcpy_s(newString, length+5, string);
newString[length] = ch;
newString[length + 1] = '\0';
return newString;
}
int main(void)
{
char * string = "my1name234is56";
printf("%s\n\n", string);
char * string2 = append(string, strlen(string), 'x');
printf("%s", string2);
}
现在,它正在工作。
Edit3:根据 alk 进行的以下修改对我有用:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void append(char ** string, int length, char ch)
{
char * newString = (char *)malloc(sizeof(char)*(length + 2));
strcpy_s(newString, length + 1, *string);
newString[length] = ch;
newString[length + 1] = '\0';
*string = newString;
}
int main(void)
{
char * string = "my1name234is56";
printf("%s\n\n", string);
append(&string, strlen(string), 'x');
printf("%s\n\n", string);
}
答案 0 :(得分:2)
char * string = "my1name234is56";
是字符串文字。无法将扩展字符串写回的原因有两个:
在任何情况下,函数定义都有太多星号,应该是
void append(char * string, int length, char ch)
甚至更好
void append(const char * string, int length, char ch)
表示不应将其写入,并且整个构想是禁止进入的。您必须创建一个新字符串并返回指向该字符串的指针
char *append(const char * string, int length, char ch) {
// ...
return newString;
}
int main() {
//...
string = append(string, strlen(string), 'x');
}
答案 1 :(得分:2)
你快到了。
仍然,您需要将传入的指针的值更改为分配给内存的指针的值,而不是释放它。
下面仅显示更改的行。
...
void append(char ** string, size_t length, char ch)
{
printf("%s\n", *string);
...
strcpy(newString, *string);
...
*string = newString;
}
int main(void)
{
...
append(&string, strlen(string), 'x');
...
}
BTW,您不需要传递源的大小,但是您可以通过执行strlen(*string)
轻松地在函数内部派生它。
对不完整的代码表示抱歉。看来,我是从坐在一个高度完整的代码泄漏检测系统后面发布答案的。