1

我的问题很简单:

假设你有这个:

char *chrptr = "junk";

想象当时,*chrptr会指向j。有没有办法将当前字符j增加到下一个字符,在这种情况下是k?我不想转到下一个字符,我想增加当前指向的字符。

我是 C 的新手,我尝试过的方法:(*chrptr)++不起作用。

4

4 回答 4

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;
于 2012-10-23T05:49:20.943 回答
2
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++由于运算符优先级而先递增然后取消引用。如果不确定优先级,请添加括号。

于 2012-10-23T05:55:09.230 回答
1

您无需使用取消引用运算符再次取消引用指针*

您只需要chrptr++在内存中推进字符指针。

更新

您可以环绕一个while循环来搜索字符。

char *chrptr = "junk";
char search = 'k';

while (*chrptr) {
  if (*chrptr == search)
    printf("%c\n", *chrptr);
  chtptr++;
}
于 2012-10-23T05:49:20.193 回答
1

看到这个 (*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)++ 会工作。希望这会对你有所帮助。祝你好运:)

于 2012-10-23T06:10:22.830 回答