1203081549 发表于 2024-7-29 12:12:59

c语言指针

int main()
{
    char c,ch,*p=c,*q=ch;
    gets(c);
    while(*p)
      p++;
    while(*p)
    {
      *q=*p;
      p--;
      q++;
    }
    puts(c);
    puts(ch);
}
逆序存放数组,输出没有结果怎么回事

wp231957 发表于 2024-7-29 12:18:58

while(*p)
      p++;   这里p都走到尾部了,下面的while(*p)还能进去吗

1203081549 发表于 2024-7-29 12:45:21

wp231957 发表于 2024-7-29 12:18
while(*p)
      p++;   这里p都走到尾部了,下面的while(*p)还能进去吗

你好,我修改了之后
int main()
{
    char c,ch,*p=c,*q=ch;
    gets(c);
    while(*p)
      p++;
    p=p-1;
    while(*p)
    {
      *q=*p;
      q++;
      p--;
    }
    *q='\0';
    puts(ch);
}
逆序存放后还输出了一个@字符这是什么情况

三体人的智子 发表于 2024-7-29 13:16:32

本帖最后由 三体人的智子 于 2024-7-29 13:17 编辑

1203081549 发表于 2024-7-29 12:45
你好,我修改了之后
int main()
{


我在测试你程序时也出现了乱码


这里建议修改:将 puts改为printf //printf是标准的输出函数

最终代码如下(建议楼主提交代码用代码格式)
#include<stdio.h>
int main()
{
    char c,ch,*p=c,*q=ch;
    gets(c);
    while(*p)
      p++;
    p=p-1;
    while(*p)
    {
      *q=*p;
      q++;
      p--;
    }
    *q='\0';
    printf(ch);
}


{:10_256:}

行客 发表于 2024-8-1 12:56:32

在第一个 while 循环中,while(*p) 的目的是找到字符串的结束符 \0。但是当循环结束时,p 指向了字符串的结束符位置,即 c 数组的最后一个元素之后。

第二个 while 循环的条件 while(*p) 初始化时就错了,因为此时 p 已经指向了字符串的结束符\0,所以这个循环根本不会执行,导致没有进行任何字符的复制操作。

修正建议: 要实现字符串逆序,可以在找到字符串结束符后,不改变 p 的位置,直接开始逆序复制字符到 ch 中,并在复制时跳过结束符\0。修正后的代码示例如下:

#include <stdio.h>
#include <string.h>

int main() {
    char c, ch, *p = c, *q = ch;
   
    gets(c);
   
    // 找到字符串结束符
    while (*p) p++;
    p--; // 将 p 回退到最后一个字符的位置,因为在结束符前停止了
   
    // 逆序复制,不包括结束符
    while (p >= c) {
      *q = *p;
      p--;
      q++;
    }
    *q = '\0'; // 在复制结束后给新字符串添加结束符
   
    puts(c);       // 输出原字符串
    puts(ch);      // 输出逆序后的字符串
   
    return 0;
}
页: [1]
查看完整版本: c语言指针