你好,我是 C 语言的新手。基本上我试图将 char array(string) 的指针传递给一个函数,在该函数中我想在该数组的最后添加一个字符。这是我要运行的代码。
所以我说的函数是代码中的function1。 指针线是我试图操纵的。 我正在尝试使用追加方法向 function1 内的行添加一个字符。 我也尝试了其他几种方法,但都没有真正奏效。
如果有人能告诉我如何正确地做这件事,那将非常有帮助。
#include <stdio.h>
#include <string.h>
char* function1(char* );
void append(char* , char );
int main(int argc, char const *argv[])
{
/* code */
function1("each line ends with : ");
return 0;
}
char* function1(char* line)
{
int pos = 0;
char* longest = "";
printf("so far working!\n");
append(line, '$');
// here during append something happens and all it tells is segmentation fault core dumped
printf("not anymore.\n");
return longest;
}
void append(char* s, char c)
{
s[strlen(s)] = c;
s[strlen(s)+1] = '\0';
}
最佳答案
问题是没有为您的字符串分配足够的空间 - 当您声明该字符串时,您说“它不会超过 n 个字节长”(包括终止 '\0'
).在内存中写入不属于该字符串的字节将导致您看到的错误。
当您使用 C 时没有通用的解决方案 - 在您的示例中,您从一个常量字符串开始(预先定义为 "each line ends with: "
)并且编译器只分配它很大的空间。如果您认为您可能需要更多空间,您可以这样做:
char mySpace[101]; // allocates 101 bytes : 100 characters + terminating '\0'
strncpy(mySpace, "each line ends with: ", 100); / copy at most 100 bytes
现在您可以将 mySpace
的长度增加一个字符(与原始字符串不同,由于您创建它的方式,它是一个常量,您可以对拷贝做任何您想做的事当您保持在为其分配的内存限制内时):
int length;
length = strlen(mySpace);
mySpace[length] = '$';
mySpace[length+1] = '\0';
这有意义吗?
编辑 刚刚意识到另一个问题:
在代码片段中
s[strlen(s)] = c;
s[strlen(s)+1] = '\0';
在第一行中,您覆盖了字符串的终止字符 '\0'
:当您在第二行中调用 strlen
时,该函数会尝试查找行尾字符(不再存在)并且它跑到远处,一直到段错误(这大致意味着“程序最终试图访问不属于它的内存”)。当我编写代码片段时,我本能地以正确的方式做到了这一点 - 然后我再次查看了您的代码,发现问题就在眼前。
关于c++ - 如何在函数内部操作 char 数组(字符串)的指针,它在 c/c++ 中作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19017850/