1

我在这里尝试完成的是获取一个 cString 并将某个字符替换为另一个我通过使用 strchr() 函数找到的位置。

我想不通的是如何替换字符我所有的尝试(下面注释掉)都产生未经编辑的字符串或使程序崩溃。我相信我正在朝着正确的方向替换字符(取 char *c 的起始地址并添加 n(我要替换的字符向前的字节数),然后写入该新地址。),但是我似乎无法让它正常运行。

任何帮助表示赞赏。

int main()
{
    char *c, *sch;
    int n;

    c = "this is a test\n";

    sch = strchr(c, 'a');

    if(sch != NULL)
    {
        n = sch-c+1;

        printf("%d\n", (int)sch);
        printf("%d\n\n", (int)c);

        printf("'a' found at: %d", n);
    }

    /////////////////////
    //sch = &c;
    //*(sch + n) = 'z';
    /////////////////////
    //*(c + n) = 'z';
    /////////////////////
    //c[n] = 'z';
    /////////////////////

    printf("\n\n%s", c);

    getchar();
    return 0;
}
4

5 回答 5

2

编辑:首先,c应该是一个数组而不是指向字符串文字的指针,因为字符串文字存储在只读内存中,尝试修改它们通常会导致崩溃。

所以,首先,

char c[]= "this is a test\n"

这会将可修改的字符串初始化为该值,您可以毫无问题地对其进行编辑。

通常,您不应该直接将字符串文字分配给char *,因为您可能会遇到此类问题;相反,只将它们分配给const char *,这样任何修改尝试都会导致编译错误。


然后,strchr已经返回了一个指向匹配字符的指针(如文档中所述),您可以直接更改它,不涉及指针运算:

*sch = 'z';

不过,如果您想尝试指针算术,则定义中存在错误n

n = sch-c+1;

如果然后将其用作字符串的索引,则应删除该 1,因为数组(和字符串)是从零开始的。换句话说:如果您分配给n该值,则以下代码:

*(c + n) = 'z';

(相当于

c[n] = 'z';

)

将意味着

*(c + sch - c + 1) 

那是,

*(sch+1)

即由 找到的字符之后的字符strchr。删除+1意志就可以解决问题(尽管简单地说,这只是一种复杂的方式*sch='z')。

另一种尝试是错误的,因为在您的代码&c中将产生一个char **,即指向 char 的指针的指针,这不是您想要的。

于 2011-06-15T21:56:42.793 回答
1

在 C 中,带引号的字符串是 a char *,但这并不意味着您可以修改它。尝试使用c数组 ( char c [] = "this is a test\n";) 甚至分配内存并将文本复制进去。

于 2011-06-15T21:58:57.393 回答
1

在您的代码中,c指向一个常量字符串(字符串文字)。修改它是未定义的行为。您应该将其复制到 char 数组中(例如:

char c[] = "This is a test"

您被注释掉的第一次尝试获取地址c并将其放入sch- 这会产生 a char**,这不是您想要的。顺便说一句,编译器应该已经接受了 - 可能会打开更多警告。

你的第二次尝试应该没问题,第三次基本一样。

顺便说一句: n 应该是sch - c- 不需要+ 1,并且你应该初始化n一些东西,以防你找不到你正在寻找的角色..

于 2011-06-15T22:00:52.933 回答
0

这里的问题不在于您的指针算术(尽管您使它变得比需要的更复杂,请参阅 Matteo Italia 的答案)。

您的问题是以下代码没有按照您的想法执行:

char *c;

c = "this is a test\n";

此代码创建一个指针并为其分配一个静态字符串的地址。即使有 Matteo 的建议,您也无法修改静态字符串。

要解决此问题,您可以执行以下两项操作之一。您可以声明c为数组并使用字符串对其进行初始化。您也可以让c保留一个指针,然后用于malloc分配缓冲区(将缓冲区的地址存储在 中c),然后用于strcpy将静态字符串复制到缓冲区中。那时,您应该能够像尝试那样操作字符串。

于 2011-06-15T22:02:51.473 回答
0
 #include <stdio.h>
 #include <string.h>

int main()
{
char c[80], *sch;
int n;


scanf("%s", c);printf("string %s \n", c);
//c = "this is a test\n";

sch = strchr(c, 'a');

if(sch != NULL)
{
    n = sch-c;

    printf("%d\n", (int)sch);
    printf("%d\n\n", (int)c);

    printf("'a' found at: %d", n);
}

/////////////////////
sch = &c;
*(sch + n) = 'z';
/////////////////////
*(c + n) = 'z';
/////////////////////
c[n] = 'z';
/////////////////////

printf("\n\n%s", c);

getchar();
return 0;

使用字符串“this-is-a-test”在代码段上方运行

您早期代码的问题是字符串文字最终位于只读部分,您无法修改它们。因此,将其写为char c[] ="this is a string" 也无济于事。

于 2011-06-15T22:15:18.557 回答