鱼C论坛

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

程序理解求助~

[复制链接]
发表于 8 小时前 | 显示全部楼层 |阅读模式

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

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

x
void delete_string(char str[],char ch)
{
        int i,j;
        for(i=j=0;str[i]!='\0';i++)
        {
                if(str[i]!=ch)
                {
                        str[j++]=str[i];
                }
        }
        str[j]='\0';
}

如上是一段引用外部变量的程序,其功能是将输入的一串字符中去掉一个字符,我不太能理解for语句里面的内容,能否帮我解答一下~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 8 小时前 | 显示全部楼层
你好!我来帮你分析这段代码。

首先,你提供的代码有一些问题,主要是参数 str 被声明为 char 类型(单个字符),而不是字符串指针(如 char*)。这会导致函数无法正确处理字符串。此外,for 循环中的逻辑也不正确。

下面我来解释 for 语句的部分,并指出问题:

原代码 for 循环分析:

  1. for(i=j=0; str!='\0'; i++)
  2. {
  3.     if(str!=ch)
  4.     {
  5.         str=str;  // 这行没有实际作用,相当于空操作
  6.     }
  7. }
复制代码


- str!='\0':这里 str 是单个字符,不是字符串,所以这个条件可能永远为真或假(取决于传入的字符值),无法正确遍历字符串。
- 循环体内 if(str!=ch) 检查字符是否不等于 ch,但 str=str 没有修改任何内容,所以整个循环无效。
- 最后 str='\0' 只是将参数 str(传值方式)设置为空字符,不影响外部变量。

正确版本的代码逻辑:
要删除字符串中的所有指定字符,应该使用字符串指针,并通过两个索引(i 和 j)来遍历和重建字符串。以下是修正后的代码示例:


  1. void delete_string(char *str, char ch)
  2. {
  3.     int i, j;
  4.     for (i = j = 0; str[i] != '\0'; i++) {
  5.         if (str[i] != ch) {
  6.             str[j] = str[i];
  7.             j++;
  8.         }
  9.     }
  10.     str[j] = '\0';
  11. }
复制代码


解释 for 循环:
- i = j = 0:初始化两个索引,i 用于遍历原字符串,j 用于指向新字符串的位置。
- str[i] != '\0':循环条件,检查是否到达字符串结尾。
- 在循环体内,如果当前字符 str[i] 不等于要删除的字符 ch,则将其复制到 str[j] 位置,并递增 j。
- 循环结束后,str[j] = '\0' 添加字符串终止符,完成修改。

总结:原代码因参数类型错误和逻辑问题无法工作,建议使用指针版本。如果还有疑问,欢迎继续讨论!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 8 小时前 | 显示全部楼层
谢谢~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 8 小时前 | 显示全部楼层


不客气~ 如果还有其他编程问题,随时来问! [emoji=smile]

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-31 08:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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