如何在函数中操作字符数组(字符串)的指针,该指针在C / C ++中作为参数传递

how to manipulate a pointer of char array (string) inside a function where it is passed as a parameter in c / c++

本文关键字:指针 参数传递 操作 函数 字符 数组 字符串      更新时间:2023-10-16

你好,我是C语言的新手。 基本上,我正在尝试将 char array(string( 的指针传递给一个函数,在该函数中,我想在该数组的最后添加一个字符。 这是我尝试运行的代码。

所以我所说的函数是代码中的函数 1。指针线是我试图操纵的一条。我正在尝试使用方法追加在函数 1 内的行中添加一个字符。我也尝试了其他几种方法,但没有一种真正奏效。

如果有人可以向我展示如何正确执行此操作,那将非常有帮助。

#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] = '';
}
问题是没有

为字符串分配足够的空间 - 当您声明字符串时,您说"它将不超过 n 个字节长"(包括终止''(。在内存中写入不属于字符串的字节将导致您看到的错误。

当你使用C时,没有通用的解决方案 - 在你的例子中,你从一个常量字符串开始(用"each line ends with: "定义(,编译器只分配那么多空间。如果您认为可能需要更多空间,可以执行以下操作:

char mySpace[101];  // allocates 101 bytes : 100 characters + terminating ''
strncpy(mySpace, "each line ends with: ", 100); / copy at most 100 bytes

现在,您可以将mySpace的长度增加一个字符(与原始字符串不同,原始字符串由于您创建它的方式而是一个常量,只要您保持在为其分配的内存限制范围内,您就可以对副本执行所需的操作(:

int length;
length = strlen(mySpace);
mySpace[length] = '$';
mySpace[length+1] = '';

这有意义吗?

编辑 刚刚意识到另一个问题:

在代码片段中

s[strlen(s)] = c;
s[strlen(s)+1] = '';

在第一行中,您覆盖字符串的终止''字符:当您在第二行中调用strlen时,该函数会尝试找到行尾字符(不再存在(,然后它一直跑到远处,一直到分段错误(这大致意味着"程序最终试图访问不属于它的内存"(。当我编写代码片段时,我本能地以正确的方式完成了 - 然后我再次查看您的代码,发现问题盯着我的脸。

当你在C "like this"中声明一个字符串时,你实际上没有得到一个char*。 你得到一个const char*(嗯,不是技术上的,但它通常在只读内存中(。 切勿尝试修改在字符串文本中声明的char*