从char指针打印字符

时间:2011-08-15 13:13:18

标签: c

#include <stdio.h>

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

此计划输出h T而不是输出h h。为什么会这样?

4 个答案:

答案 0 :(得分:7)

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

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

另一个错误是使用后递增,这会导致{<1}}在提取字符后递增,因此它会输出arr,而不是T

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

h

在此代码中,#include <stdio.h> int main() { char *arr = "This is to test"; char c = *(++arr); printf("\n%c %c ", c, c); return 0; } 只会递增一次,并且稍后可以使用在此位置获取的字符。

答案 1 :(得分: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"

你想做的是

printf("\n%c %c ",*(arr+1), *(arr+1));

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

答案 2 :(得分:1)

基本上是因为两个++都会在打印后将指针向前移动一步,并且今天大多数编译器生成的代码将首先完成最右边的编码。然后它会向左移动。

这是因为一元运算符arr ++将导致arr = arr + 1;,因为它使用后缀运算符,它会在将结果赋给arr之前打印。

所以执行的步骤是:

  1. 打印T
  2. 将指针移至h
  3. 打印h
  4. 将指针移至i
  5. 如果你在同一行中有三个你会得到它,因为这会导致它第三次移动。

    我相信你想要做的事情是:

    printf("\n%c %c ",*(arr+1), *(arr+1));
    

答案 3 :(得分:1)

如果你应该得到输出h h。 然后你必须写

printf("\n%c  %c",*(arr+1),*(arr+1));

但是在你的代码中你更新了arr并且这个增量是后增量所以首先它将值赋给函数参数然后变量将递增。 在功能

printf("\n%c %c ",*(arr++), *(arr++));

在堆栈上从左到右分配的值,所以您可以想象如下语句:

printf("\n%c %c ",'h', 'T');

和参数“\ n%c%c”将从左到右打印输出,你得到输出h T.