为什么我的代码无法将一个字符串复制到另一个字符串?
Why is my code failing to copy one string to another?
我想编写一个名为 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] = '[=10=]';
strcpy(string, newString);
free(newString);
}
int main()
{
char * string = "my1name234is56";
append(string, strlen(string), 'x');
printf("%s", string);
}
在函数 append()
内部:free()
之前的第二个 strcpy()
给我一个异常,程序显示:
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] = '[=15=]';
strcpy_s(*string, length + 2, newString);
*string = newString;
}
int main(void)
{
char * string = "my1name234is56";
append(&string, strlen(string), 'x');
printf("%s", string);
}
还是不行。
Edit2:我根据“Weather Vane”进行了以下编辑:
#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] = '[=16=]';
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] = '[=17=]';
*string = newString;
}
int main(void)
{
char * string = "my1name234is56";
printf("%s\n\n", string);
append(&string, strlen(string), 'x');
printf("%s\n\n", string);
}
char * string = "my1name234is56";
是一个 字符串文字 。无法将扩展字符串写回它的原因有两个:
- 没有足够的内存来容纳额外的字符。
- 它是只读的。
不管怎么说,函数定义的星号太多了,应该是
void append(char * string, int length, char ch)
甚至更好
void append(const char * string, int length, char ch)
这表明它不应该被写入,整个想法是禁止的。您必须创建一个新字符串和 return 指向该字符串的指针
char *append(const char * string, int length, char ch) {
// ...
return newString;
}
int main() {
//...
string = append(string, strlen(string), 'x');
}
你快到了。
仍然,您需要将传入的指针的值更改为指向您分配的内存的指针的值,而不是释放它。
以下仅显示更改的行。
...
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');
...
}
顺便说一句,您不需要传入源的大小,但您可以通过执行 strlen(*string)
.
在函数内部轻松导出它
抱歉代码不完整。看来,我是坐在一个高度完整的代码泄漏检测系统后面发布了答案。
我想编写一个名为 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] = '[=10=]';
strcpy(string, newString);
free(newString);
}
int main()
{
char * string = "my1name234is56";
append(string, strlen(string), 'x');
printf("%s", string);
}
在函数 append()
内部:free()
之前的第二个 strcpy()
给我一个异常,程序显示:
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] = '[=15=]';
strcpy_s(*string, length + 2, newString);
*string = newString;
}
int main(void)
{
char * string = "my1name234is56";
append(&string, strlen(string), 'x');
printf("%s", string);
}
还是不行。
Edit2:我根据“Weather Vane”进行了以下编辑:
#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] = '[=16=]';
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] = '[=17=]';
*string = newString;
}
int main(void)
{
char * string = "my1name234is56";
printf("%s\n\n", string);
append(&string, strlen(string), 'x');
printf("%s\n\n", string);
}
char * string = "my1name234is56";
是一个 字符串文字 。无法将扩展字符串写回它的原因有两个:
- 没有足够的内存来容纳额外的字符。
- 它是只读的。
不管怎么说,函数定义的星号太多了,应该是
void append(char * string, int length, char ch)
甚至更好
void append(const char * string, int length, char ch)
这表明它不应该被写入,整个想法是禁止的。您必须创建一个新字符串和 return 指向该字符串的指针
char *append(const char * string, int length, char ch) {
// ...
return newString;
}
int main() {
//...
string = append(string, strlen(string), 'x');
}
你快到了。
仍然,您需要将传入的指针的值更改为指向您分配的内存的指针的值,而不是释放它。
以下仅显示更改的行。
...
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');
...
}
顺便说一句,您不需要传入源的大小,但您可以通过执行 strlen(*string)
.
抱歉代码不完整。看来,我是坐在一个高度完整的代码泄漏检测系统后面发布了答案。