c - 为什么我的代码无法将一个字符串复制到另一个字符串?
问题描述
我想编写一个名为append()
target 的 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);
}
解决方案
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');
}
推荐阅读
- php - PHP - 在另一个变量中为稍后的 If 语句更改变量的值
- javascript - 按 localStorage 中的值排序
- python - Python中“[]”和“list”的区别
- geospatial - 在 GeoDMS 中,我们如何连接两条弧线?
- php - PHP DOMDocument loadHTML 返回两个 HTML childNodes
- scala - 为什么使用 3 个元素的元组时会出现 CombineByKey 错误?
- java - Files.createDirectory 的返回值有什么用
- python-3.x - Visual Studio Code Python linting 不适用于 venv 和 wsl
- c# - 通过数组循环项目的最佳实践
- ruby-on-rails - 如何在控制器中使用“.where”和“.where.not”方法测试实例变量