如何访问字符串中的单独字符?

时间:2015-12-23 00:05:14

标签: c pointers

我有一个这样的字符串:

char* hello = "Hello, world!";

我必须遍历此字符串中的每个字符。我试过这些,但是他们要么给我编译错误,要么违反访问权限,或者只是永远不要离开循环:

for( char* p = hello; p!=0; p++ ) printf("%x\n", p);

for( char* p = &hello; p!=0; p++ ) printf("%x\n", p);

for( char* p = *hello; p!=0; p++ ) printf("%x\n", p);

for( char* p = hello; *p!=0; *p++ ) printf("%x\n", *p);

我真的不明白指针在C中是如何工作的,我只是随机地放置星号直到它起作用,在这种情况下它不会。

我不像其他问题那样使用strlen

2 个答案:

答案 0 :(得分:5)

p是指向char的指针。因此,用*p取消引用它会产生 char

p添加1会将其移动到您所在的任何字符串中的下一个字符 遍历。向*p添加1会向字符p添加一个指向 到。

让我们仔细检查每一次尝试,看看它有什么问题。

char* hello = "Hello, world!";

公共部分:hello是指向char的指针,它指向一个 编译器将嵌入对象中某处的常量字符串 文件。请注意,不应更改此类字符串;你经常会得到 这样做会出错。

如果您想要更改字符串,char hello[] = "Hello, world!"; 作品;这会创建一个缓冲区作为可以自由的局部变量 操纵。

for( char* p = hello; p!=0; p++ ) printf("%x\n", p);

在这里,您正确地将p指向hello的第一个字符。 但是,您可以通过比较p来查找字符串的结尾 零。 p是一个指针,0作为指针意味着一个NULL指针。

for( char* p = &hello; p!=0; p++ ) printf("%x\n", p);

在这里,您将p指向hello的地址,意思是“{1}} 进程存储称为hello的指针。解除这个意愿 给你hello,而不是它指的是什么。

for( char* p = *hello; p!=0; p++ ) printf("%x\n", p);

在此,您取消引用hello,为char提供值H。 将此值分配给p是类型不匹配,语义上不正确 好。

for( char* p = hello; *p!=0; *p++ ) printf("%x\n", *p);

最后,您正确地将p指向的内容与零进行比较。 但是,您也会增加*p而不是p,这是不正确的, 而且(如上所述)将导致常量字符串出现问题 比如这个。 *p++也将增加p,返回p之前指出的内容 增量,因为没有使用,所以没有实际意义。

另一件事:你想要打印指针p的值,或者 它指向的char?前三个打印指针 正确。最后一个使用%x打印char。不知道是什么 会这样做,但不会是正确的。

由于您使用了%x,我假设您要打印字符本身 十六进制?那将是printf("%x\n", *p);和前一个一样。但是,我 会建议%02x使用零填充来获得恒定的宽度。

假设您要打印字符,这是一个正确的版本:

for( char* p = hello; *p!=0; p++ ) printf("%x\n", *p);

或者,由于0是假的,我们可以更简单地说一下:

for( char* p = hello; *p; p++ ) printf("%x\n", *p);

答案 1 :(得分:3)

他们都不是。

答案是:for( char* p = hello; *p !=0; p++ ) printf("%x\n", *p);

char * p =你好; // p指向第一个hello的情况,它与char *p = &hello[0];

完全相同

if(*p == 0) //检查* p =='\ 0'(ASCII中的'\ 0'== 0,表示字符串的结尾)。 * p是每p指向的地址的值。

'p ++'//增加sizeof(char)的p(所以它是+ = 1)。有了这个你好的问候[1]然后你好[2]等......