我想编写一个名为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);
}
它仍然无法正常工作。
编辑2:我根据“风向标”进行了以下编辑:
#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);
}
现在,它正在发挥作用。
编辑:根据所有,以下修改,为我工作:
#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);
}
你快到了。
但是,您需要将传入的指针的值更改为指向您分配的内存的指针的值,而不是将其释放。
以下仅显示更改的行。
...
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)
轻松地在函数内部派生它。
为不完整的代码而烦恼。我似乎是在高度完整的代码泄漏检测系统后面发布了答案。
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');
}