修改字符指针字符串数组 (char * string[])

Modify a character pointer string array (char * string[])

提问人:Stryker2k2 提问时间:11/18/2019 最后编辑:Stryker2k2 更新时间:11/18/2019 访问量:861

问:

我一直在给一个...有趣。。。任务。我被要求使用指针修改字符数组。

我知道:

*char = “某物”;是文本,无法修改。

char[] = “某物”;可以修改

但是呢:

main.c
------

static char* stringlist01[] = 
{
    "thiy iy a ytring",
    "this is also a string, unlike the first string",
    "another one, not a great one, and not really like the last two.",
    "a third string!",
    NULL,
};

int main()
{
    int ret = 9999;

    printf("////TEST ONE////\n\n");

    ret = changeLetterInString(stringlist01[0]);
    printf("Return is: %d\n\n", ret);

    printf("Stringlist01[0] is now: %s\n", stringlist01[0]);
}

changeLetterInString.c
----------------------

int changeLetterInString(char *sentence)
{    
    if (sentence != NULL)
    {
        // TODO
        // Need to change "thiy iy a ytring"
        // into "this is a string"
        // and save into same location so
        // main.c can see it.
    }

    success = 0;    // 0 is Good
    return success;
}

到目前为止,我已经尝试过:

    for (char* p = sentence; *p; ++p)
    {
        if (*p == 'y')
        {
            *p = 's';
        }
    }

我试过:

sentence[0] = 't'
sentence[1] = 'h'
sentence[2] = 'i'
sentence[3] = 's'   // and so on...

但两者都不起作用。

任何帮助和/或见解将不胜感激。

c 数组指 char 文字

评论

1赞 Some programmer dude 11/18/2019
C 语言中的文字字符串实际上是只读的,因为它们不允许被修改。并且您有一个指向此类字符串文字的指针数组(或者更确切地说是指向其第一个字符的指针)。任何修改字符串文本的尝试都会导致未定义的行为。这就是所有此类指针都应该为 .const char *
0赞 Frontear 11/18/2019
字符串文本是常量。您无法修改它。如果要修改它,则需要像数组一样读取它
0赞 Stryker2k2 11/19/2019
谢谢@Someprogrammerdude的见解!
0赞 Lundin 11/19/2019
你可以做.这将创建一个复合文本,它本质上是一个局部数组,存在于与声明相同的作用域中。它是读/写的,但你不能改变长度。最灵活的解决方案是使用动态分配 + strcpy。(char[]){ "thiy iy a ytring" }
0赞 user202729 6/18/2022
(与为什么写入使用字符串文字初始化的“char *s”而不是“char s[]”时会出现分段错误相同的问题?)

答:

2赞 Frontear 11/18/2019 #1

这两种表示法之间存在细微的差异:

char string[] = "Hello World";
// vs
char* string = "Hello World";

它们看起来很相似,对吧?但是,它们是不同的。第一个是字符数组,而第二个是指向字符数组的指针。

默认情况下,任何字符串文字将始终为 .没有办法绕过它。尝试修改字符串文本通常会导致段错误const

代码包含指向字符数组的指针数组。由于包含对常量字符串文本的指针引用,因此无法修改它们。为了修改它们,您需要将它们转换为数组,就像第一个示例中所做的那样。这会将字符串文字转换为可以修改的字符数组,而不是指向无法修改的内存的指针。

char strs[][] = {
    "Hello",
    "World"
}; // transforms the string literals into character arrays

strs[0][0] = 'X'; // valid

然而,这不会编译,并导致未定义的行为

char* strs[] = {
    "Hello",
    "World",
};

strs[0][0] = 'X'; // trying to modify a pointer to a constant string literal, undefined