C指针算术

问题描述:

我在这里试图完成的是取一个cString并用另一个地方代替某个字符,这个地方是通过使用strchr()函数找到的。C指针算术

我无法弄清楚是如何替换字符我所有的尝试(下面注释掉)都会产生未经编辑的字符串或崩溃程序。我相信我正在朝着正确的方向去取代字符(取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; 
} 

编辑:首先,c应该是一个数组,而不是一个指向字符串字面量,因为字符串常量存储在只读存储器,并试图修改它们通常会导致在崩溃。

所以,首先,

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

这初始化一个修改字符串该值,你可以毫无问题编辑。

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


然后,strchr已经返回一个指向匹配的字符(如documentation说),你可以简单地直接改变它,没有指针运算涉及:

*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的指针,这不是你想要的。

+0

'sch'指向只读的字符串文字。 – 2011-06-15 22:03:18

+0

@Bertrand:对,我会解决答案。被分配给char *的事实让我分心。 – 2011-06-15 22:04:39

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

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

char c[] = "This is a test" 

你的第一次尝试是注释掉了需要的c地址,并把它变成sch - 即产生一个char**,这是不是你想要的。编译器应该有回升,高达,顺便说一句 - 或许打开一些警告

你的第二次尝试应该是OK,而第三个是基本相同的事情

BTW:N应该是sch - c - 没有。需要+ 1,和你在一起d初始化为n以防万一您找不到您要查找的字符。

+0

这是假设你想练习你的指针算术顺便说一句 - 否则,请参阅Matteo的答案。 – rlc 2011-06-15 22:02:18

此处的问题不在您的指针算术中(尽管您要使它比需要的复杂,请参阅Matteo意大利的回答)。

你的问题是,下面的代码不会做你认为它的作用:

char *c; 

c = "this is a test\n"; 

此代码创建的指针并为其指派一个静态字符串的地址。即使有Matteo的建议,你也不能修改静态字符串。

要解决这个问题,你可以做两件事之一。您可以将c声明为一个数组,并使用该字符串初始化它。您还可以让c保持指针状态,然后使用malloc分配缓冲区(将缓冲区的地址存储在c中),然后使用strcpy将静态字符串复制到缓冲区中。在那个时候,你应该可以像你试图做的那样操纵字符串。

#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; 

运行上面的字符串片段“这 - 是 - 一测试”

问题与您前面的代码是字符串常量在只读部分结束了,你无法修改它们。所以,将它写为 char c [] =“这是一个字符串”也不会有帮助。