鱼C论坛

 找回密码
 立即注册
查看: 101|回复: 3

[已解决]将字符串前导的*移到后面,代码看不懂

[复制链接]
发表于 2024-12-7 16:06:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 跑不掉 于 2024-12-7 16:18 编辑

函数代码如下
void  fun( char *a )
{
  char *p,*q;
  int n=0;
  p=a;
  while(*p=='*')  /* 统计串头'*'个数n */
  {n++; p++;}
  q=a;
  /* 向前复制字符串,请填写相应的语句完成其功能 */

  whlie(*p)
  {
      *q = *p;
      q++;
      p++;
  }

  for(;n>0;n--)  /* 在串尾补n个'*' */
    *q++='*';
  *q='\0';  
}


第五行的p=a表示什么含义?是将a复制给p吗?可以这么用吗?不应该用strcpy或者循环进行一个一个字符地赋值吗?

感觉整段函数都有些不明白,比如为什么后面又给a赋给q?难道是地址指向的意思? 995......
最佳答案
2024-12-7 16:23:01
跑不掉 发表于 2024-12-07 16:22
重新编辑了一下帖子,可不可以再帮我解答一下


好的,我们来看一下代码并理解它的功能。

代码的目的是将字符串前导的`*`移到字符串的后面。具体步骤如下:

1. **初始化指针**:`p = a;`是将指针`p`初始化为指向字符串`a`的起始位置。这样,`p`可以用来遍历和操作字符串的内容。

2. **统计前导`*`的数量**:
while(*p=='*')  
   { 
       n++; 
       p++;
   }
   这个循环用于统计字符串开头连续的`*`的数量,同时将`p`移动到第一个不是`*`的字符位置。

3. **将非`*`字符向前移动**:
q = a;
   while(*p)
   {
       *q = *p;
       q++;
       p++;
   }
   这段代码将`p`指向的非`*`字符逐个复制到`q`指向的位置,即字符串开头的位置。

4. **在字符串末尾补`*`**:
for(; n > 0; n--)
       *q++ = '*';
   *q = '\0';
   这段代码在字符串的末尾添上统计到的`*`数量,并在字符串的最后加上一个空字符`'\0'`以表示字符串的结尾。

通过这些步骤,函数实现了将字符串前导的`*`移到它的尾部。整个过程利用了指针的操作来实现字符串的移动和复制。指针的赋值操作,比如`p = a;`,是指让`p`指向`a`所指向的地址,这样`p`就可以用于遍历`a`所表示的字符串。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-7 16:10:53 | 显示全部楼层
是的,当你使用指针来管理字符串时,可以直接赋值。像你的代码中,`p = a;` 这样的赋值是完全可以的,因为你只是将指针`p`指向了字符串常量`"zbcde"`的地址。

不过,需要注意的是,当使用字符数组而不是指针来表示字符串时,不能直接用`=`来赋值。例如:
char a[] = "zbcde"; // 用字符数组表示字符串
char b[10]; // 另一个字符数组
b = a; // 这是不允许的,用strcpy()函数

在这种情况下,应该使用`strcpy()`函数来复制字符串内容。

你的程序是正确的,因为你赋值的对象是指针而非字符数组。另外,在C语言中对于字符串的操作需要注意内存管理,以避免潜在的崩溃或内存泄漏。
#include <stdio.h>  // 别忘了添加这个头文件
int main()
{   
    char *a = "zbcde";
    char *p;
    p = a;  // 指针赋值是可以的
    puts(a); // 输出 zbcde
    puts(p); // 也输出 zbcde
    return 0;
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-12-7 16:22:50 | 显示全部楼层
FishC 发表于 2024-12-7 16:10
是的,当你使用指针来管理字符串时,可以直接赋值。像你的代码中,`p = a;` 这样的赋值是完全可以的,因为 ...

重新编辑了一下帖子,可不可以再帮我解答一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-7 16:23:01 | 显示全部楼层    本楼为最佳答案   
跑不掉 发表于 2024-12-07 16:22
重新编辑了一下帖子,可不可以再帮我解答一下


好的,我们来看一下代码并理解它的功能。

代码的目的是将字符串前导的`*`移到字符串的后面。具体步骤如下:

1. **初始化指针**:`p = a;`是将指针`p`初始化为指向字符串`a`的起始位置。这样,`p`可以用来遍历和操作字符串的内容。

2. **统计前导`*`的数量**:
while(*p=='*')  
   { 
       n++; 
       p++;
   }
   这个循环用于统计字符串开头连续的`*`的数量,同时将`p`移动到第一个不是`*`的字符位置。

3. **将非`*`字符向前移动**:
q = a;
   while(*p)
   {
       *q = *p;
       q++;
       p++;
   }
   这段代码将`p`指向的非`*`字符逐个复制到`q`指向的位置,即字符串开头的位置。

4. **在字符串末尾补`*`**:
for(; n > 0; n--)
       *q++ = '*';
   *q = '\0';
   这段代码在字符串的末尾添上统计到的`*`数量,并在字符串的最后加上一个空字符`'\0'`以表示字符串的结尾。

通过这些步骤,函数实现了将字符串前导的`*`移到它的尾部。整个过程利用了指针的操作来实现字符串的移动和复制。指针的赋值操作,比如`p = a;`,是指让`p`指向`a`所指向的地址,这样`p`就可以用于遍历`a`所表示的字符串。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-10 16:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表