从char指针打印字符

Ang*_*gus 1 c

#include <stdio.h>

int main()
{
 char *arr = "This is to test";
 printf("\n%c %c ",*(arr++), *(arr++));
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序输出h T而不是输出h h.为什么会这样?

sch*_*der 7

在一个语句中使用两个相互独立的递增运算符会导致未定义的行为,因为编译器可以自由选择首先执行哪个增量(或者更确切地说,您没有给编译器提供任何首先要做的提示).

无论如何,如果你期望的话h h,写*(arr++)两次也是错的,因为它们将被执行两次,递增arr 两次 - 因此将打印两个不同的字符(arr[0]arr[1]).

另一个错误是使用后增量,这将导致在获取字符arr递增,因此它将输出,而不是.Th

所以一个可能的解决方案是这个代码,使用另一个变量:

#include <stdio.h>

int main()
{
 char *arr = "This is to test";
 char c = *(++arr);
 printf("\n%c %c ", c, c);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,arr只会增加一次,并且稍后可以使用在此位置获取的字符.


Joe*_*Joe 5

arr ++相当于arr + = 1.你实际上正在递增arr.这就是你的情况.

printf("\n%c %c ",*(arr++), *(arr++));
//                  ^         ^Evaluates to 0 therefore prints T then increments by 1
//                  ^Evaluates to 1 therefore prints h and then increments by 1
//Now if where to prinf %s arr it should print "is is to test"
Run Code Online (Sandbox Code Playgroud)

你想做的是

printf("\n%c %c ",*(arr+1), *(arr+1));
Run Code Online (Sandbox Code Playgroud)

注意:正如其他人已经指出多个pre/postfix ++/ - 产生未定义的行为(评估顺序)并且应该避免,尽管我在你的情况下理解你并没有尝试修改原始数组.