【问题标题】:C pointer mistakes in my understanding of the problem我对C指针错误的理解问题
【发布时间】:2023-02-06 14:55:26
【问题描述】:

执行后的输出结果为______

#include<stdio.h>
int main()
{  char str[]="xyz",*ps=str;
   while(*ps) 
       ps++;
   for(ps--;ps-str>=0;ps--)
       puts(ps);
   return 0;
}

正确答案是
z
yz
xyz

我的逻辑是
while(*ps) ps++;之后*ps代表" "数组的最后一个元素
执行codefor(ps--;ps-str&gt;=0;ps--)puts(ps);,*ps时每次都返回两个位置。 所以我认为应该是
z
xyz

【问题讨论】:

  • “在while(*ps) ps++;*ps之后代表" "- 不。 *ps 就是'\0'。你的程序已经在输出你声称是正确答案的字符串,那么你想改变什么?
  • 该程序具有未定义的行为,并且不能保证特定的输出。具体来说,将 ps 递减到 str 之前是未定义的行为。
  • 循环一次只移动一个元素。我怀疑它是否严格符合语言标准。你正在运行你的指针开始数组,然后将其与数组地址进行比较。这是未定义的行为。据我所知,只有当你跑到另一端时,你才被允许这样做。而且只有最后一次。在那。
  • 编译器可能做出的合理优化是注意 ps-str&gt;=0is always true (since ps` 在法律上永远不能小于 str),因此从 for 循环中省略该测试。
  • 用伪代码术语来说,代码试图做什么?不要用变量来描述。

标签: c


【解决方案1】:

“在while(*ps) ps++;*ps之后代表" "

不,*ps 就是 '

【解决方案2】:

可能更接近你想要的:

int main()
{  
   char str[]="xyz";
   size_t length = sizeof(str)-1;
   // size_t length = strlen(str); // safer version of above.
 
   for (size_t i = 0; i < length; i++)
   {
       char* ps = str+length-i-1;
       puts(ps);
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多