我的问题很简单:
说你有这个:
char *chrptr = "junk";
想象一下,*chrptr
当时会指向j
。有没有办法将当前字符j
增加到下一个字符,在这种情况下是k
?我不想去下一个角色,我想增加当前指向的角色。
我是C的新手,我尝试过:(*chrptr)++
不起作用。
答案 0 :(得分:3)
根据您的编辑,您似乎想要修改字符串,您不能使用常量字符串,实际上您可以但该行为未定义。因此,您需要将定义更改为非常量字符数组:
//This initializes a 5 element array including the null byte at the end
char chrptr[] = "junk";
//now you can modify that
chrptr[0]++;
//or equivalently
chrptr[0] +=1;
chrptr[0] = chrptr[0]+1;
答案 1 :(得分:2)
char *chrptr = "junk";
这段代码并不是很好。像“垃圾”这样的字符串文字是指向只读内存的指针。你不应该修改它们。所以要么说:
const char* chrptr = "junk"; // pointer to a const; no modifications
或(在您的情况下):
char chrArray[] = "junk";
这会在堆栈上创建一个5元素的字符数组,用“垃圾”(加上空终止符)初始化它。现在您可以自由修改它:
chrArray[0] ++;
(*chrArray) ++;
(一些剩余的评论)
我是c的新手,但是(* chrptr)++之类的东西不起作用。
他们做工作,但不同。让我总结一下:
chrptr
是指向char的类型的值。*chrptr
是char类型的值,因为指针已被解除引用。这两个都恰好是“l-values”(=实际对象),所以你可以修改它们:
++ chrptr
将指针递增1(=将指针向前推进一个对象)++ *chrptr
将char加1(=将'a'
更改为'b'
)。(之前,++*chrptr
不适合您,因为该字符串位于内存的只读部分。如果您使用const char*
而不是char*
指向该字符串,那么d得到一个有用的编译错误而不是意外的运行时行为。)
另请注意:
如果是简单陈述,++*chrptr;
相当于(*chrptr)++;
。操作员顺序很重要(取消引用,然后递增)。
OTOH,由于operator precedence,*chrptr++
是增量 - 然后 - 解除引用。如果不确定优先级,请添加括号。
答案 2 :(得分:1)
您无需使用取消引用运算符*
再次取消引用指针。
你只需要chrptr++
来推进内存中的字符指针。
<强>更新强>
您可以包裹while
循环来搜索角色。
char *chrptr = "junk";
char search = 'k';
while (*chrptr) {
if (*chrptr == search)
printf("%c\n", *chrptr);
chtptr++;
}
答案 3 :(得分:1)
见(* chrptr)++;工作正常,但这会增加chrptr指向的数组的第一个字符。 在您的情况下,您使用的语句如
char * chrptr =“junk”;
这里chrptr指向一个const char数组,所以使用(* chrptr)++;它会增加不会反映字符串中的变化。
但是如果你这样使用代码(http://codepad.org/FJMB1ryv): -
#include<iostream>
using namespace std;
int main()
{
char a[]="yogendra";
char *y=a;//(char*)"junk";
(*y)++;
cout<<y<<endl;
return 0;
}
你(* y)++会工作。希望这会对你有所帮助。祝你好运:)