我的问题很简单:
假设你有这个:
char *chrptr = "junk";
想象当时,*chrptr
会指向j
。有没有办法将当前字符j
增加到下一个字符,在这种情况下是k
?我不想转到下一个字符,我想增加当前指向的字符。
我是 C 的新手,我尝试过的方法:(*chrptr)++
不起作用。
根据您的编辑,您似乎想要修改字符串,您不能使用常量字符串来执行此操作,实际上您可以,但该行为是未定义的。因此,您需要将定义更改为非常量字符数组:
//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;
char *chrptr = "junk";
这段代码真的不是很好。像“垃圾”这样的字符串文字是指向只读内存的指针。你不应该修改它们。所以要么说:
const char* chrptr = "junk"; // pointer to a const; no modifications
或(在您的情况下):
char chrArray[] = "junk";
这会在堆栈上创建一个 5 元素的字符数组,用“垃圾”(加上空终止符)对其进行初始化。现在您可以随意修改它:
chrArray[0] ++;
(*chrArray) ++;
(一些剩余的评论)
我是 c 新手,但 (*chrptr)++ 之类的东西不起作用。
它们确实有效,但不同。让我总结一下:
chrptr
是指向字符的指针类型的值。*chrptr
是 char 类型的值,因为指针已被取消引用。这两个恰好是“左值”(=实际对象),因此您可以修改它们:
++ chrptr
将指针加一(= 将指针前移一个对象)++ *chrptr
将 char 加一(='a'
变为'b'
)。(以前,++*chrptr
因为字符串位于内存的只读部分中,所以对您不起作用。如果您使用const char*
not指向它char*
,您会得到一个有用的编译错误,而不是意外的运行时行为。)
另请注意:
在简单语句的情况下,++*chrptr;
等价于(*chrptr)++;
。运算符顺序很重要(取消引用,然后递增)。
OTOH,*chrptr++
由于运算符优先级而先递增然后取消引用。如果不确定优先级,请添加括号。
您无需使用取消引用运算符再次取消引用指针*
。
您只需要chrptr++
在内存中推进字符指针。
更新
您可以环绕一个while
循环来搜索字符。
char *chrptr = "junk";
char search = 'k';
while (*chrptr) {
if (*chrptr == search)
printf("%c\n", *chrptr);
chtptr++;
}
看到这个 (*chrptr)++; 工作正常,但这将增加 chrptr 指向的数组的第一个字符。在您的情况下,您正在使用如下语句
char *chrptr = "垃圾";
这里 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)++ 会工作。希望这会对你有所帮助。祝你好运:)