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的指针,这不是你想要的。
在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
以防万一您找不到您要查找的字符。
这是假设你想练习你的指针算术顺便说一句 - 否则,请参阅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 [] =“这是一个字符串”也不会有帮助。
'sch'指向只读的字符串文字。 – 2011-06-15 22:03:18
@Bertrand:对,我会解决答案。被分配给char *的事实让我分心。 – 2011-06-15 22:04:39