鱼C论坛

 找回密码
 立即注册
查看: 1446|回复: 17

[已解决]C语言考试题!跪求大神解答!

[复制链接]
发表于 2020-12-22 21:18:36 | 显示全部楼层 |阅读模式

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

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

x
规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是将字符串中的*号全部删除,前导和尾部的*号不删除。例如输入字符串”******abcAf**G**”,输出为******abcAfG**。在fun函数中填写。
  #include<stdio.h>
void  fun( char *a)
{




/*大大的问号?*/





}
main()
{
   char s[81];
   printf(“Enter a string:\n”);
   gets(s);
   fun(s);
   printf(“The string after deleted:\n”);
   put(s);
}
最佳答案
2020-12-22 21:44:35
#include <stdio.h>
#include <string.h> 

void fun(char * a)
{
        int c , i , j , m                        ;
        for(m = 0 ; a[m] ; m ++)                 ;
        for(i = 0 ; i < m && a[i] == '*' ; i ++) ;
        for(c = 0 , j = i ; i < m ; i ++) {
                if(a[i] != '*') {
                        a[j ++] = a[i]           ;
                        if(c) c = 0              ;
                } else {
                        c ++                     ;
                }
        }
        for(i = 0 ; i < c ; i ++) a[j ++] = '*'  ;
        a[j] = '\0'                              ;
}

main()
{
   char s[81]                                    ;
   printf("Enter a string: ")                    ;
   gets(s)                                       ;
   fun(s)                                        ;
   printf("The string after deleted:\n")         ;
   puts(s)                                       ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-22 21:44:35 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>
#include <string.h> 

void fun(char * a)
{
        int c , i , j , m                        ;
        for(m = 0 ; a[m] ; m ++)                 ;
        for(i = 0 ; i < m && a[i] == '*' ; i ++) ;
        for(c = 0 , j = i ; i < m ; i ++) {
                if(a[i] != '*') {
                        a[j ++] = a[i]           ;
                        if(c) c = 0              ;
                } else {
                        c ++                     ;
                }
        }
        for(i = 0 ; i < c ; i ++) a[j ++] = '*'  ;
        a[j] = '\0'                              ;
}

main()
{
   char s[81]                                    ;
   printf("Enter a string: ")                    ;
   gets(s)                                       ;
   fun(s)                                        ;
   printf("The string after deleted:\n")         ;
   puts(s)                                       ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 23:35:29 | 显示全部楼层

大神,你能把你的程序思路简单介绍一下吗?我不是很懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 23:41:04 | 显示全部楼层
观摩上面大神写的.....自己写的,调试了几次本来是从位置79往前找不是*和\0的位置,结果不行,最后还是从0开始老老实实找'\0'位置,再从'\0'位置往前找不是*的位置....
#include<stdio.h>
void fun(char *a)
{
        int i,j;
        int start=0,end=0;//start为开始不是*的起始位置,end是'\0'的位置
        for(i=0;i<80;i++)
        {
                if(a[i] != '*')
                {
                        start=i;
                        break;
                }
        }
        for(i=0;i<80;i++)
        {
                if(a[i]=='\0')
                {
                        end=i;
                        break;
                }
        }
        for(j=end;j>=0;j--)//从后面开始找到不是*的位置j
        {
                if(a[j] != '*' && a[j] != '\0')
                {
                        break;
                }
        }
        printf("start=%d,end=%d\n",start,j);
        for(i=start;i<j;i++)
        {
                if(a[i]=='*')
                {
                        for(start=i;start<80;start++)
                        {
                                a[start]=a[start+1];
                        }
                        i--;
                        j--;
                }
        }
}
main()
{
   char s[81];
   printf("Enter a string:\n");
   gets(s);
   fun(s);
   printf("The string after deleted:\n");
   puts(s);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 23:43:48 | 显示全部楼层
有没有大神帮看看我的程序有什么优化没有?或者有什么问题
#include<stdio.h>
void fun(char *a)
{
        int i,j;
        int start=0,end=0;//start为开始不是*的起始位置,end是'\0'的位置
        for(i=0;i<80;i++)
        {
                if(a[i] != '*')
                {
                        start=i;
                        break;
                }
        }
        for(i=0;i<80;i++)
        {
                if(a[i]=='\0')
                {
                        end=i;
                        break;
                }
        }
        for(j=end;j>=0;j--)//从后面开始找到不是*的位置j
        {
                if(a[j] != '*' && a[j] != '\0')
                {
                        break;
                }
        }
        printf("start=%d,end=%d\n",start,j);
        for(i=start;i<j;i++)
        {
                if(a[i]=='*')
                {
                        for(start=i;start<end;start++)//往前挪动
                        {
                                a[start]=a[start+1];
                        }
                        i--;
                        j--;
                        end--;
                }
        }
}
main()
{
   char s[81];
   printf("Enter a string:\n");
   gets(s);
   fun(s);
   printf("The string after deleted:\n");
   puts(s);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 23:52:12 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-22 23:54 编辑
肚子饿了233 发表于 2020-12-22 23:35
大神,你能把你的程序思路简单介绍一下吗?我不是很懂


        先用一个循环跨过字符串开头的所有 '*' 字符
        从第一个非 '*' 开始,再设计一个循环,循环变量继续是 i ,用于遍历字符串的每一个字符,同时新增加一个下标变量 j,专门用来写字符。如果在循环中没有删除字符,那么,i 和 j 将一直相等,但是,如果有,那就会不一样。在循环中,始终只复制非 '*' 字符,遇到 '*' 字符时,用变量 e 进行计数,在遇到非 '*' 字符时将 e 清零,这样,当循环结束的时候,只要看看 e 的数值,就可以知道字符串的末尾有几个 '*' 字符,专门用循环把这些 '*' 字符悉数补到字符串的末尾就可以了。
         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-12-23 00:04:42 | 显示全部楼层
jackz007 发表于 2020-12-22 23:52
先用一个循环跨过字符串开头的所有 '*' 字符
        从第一个非 '*' 开始,再设计一个循环, ...

完美
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 15:47:07 | 显示全部楼层
不懂就问? for(m = 0 ; a[m] ; m ++)   这行代码里a[m]这条判断语句是怎么理解的呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 15:56:43 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-23 15:57 编辑
肚子饿了233 发表于 2020-12-23 15:47
不懂就问? for(m = 0 ; a[m] ; m ++)   这行代码里a[m]这条判断语句是怎么理解的呀?


       这个循环是用来计算字符串 a 的长度的,其作用与
       m = strlen(a) ;
       完全相同。
       此循环中间的条件 a[m] ,实际上等同于下面的表达
       a[m] != '\0'
       也就是说,只要 a[m] 不是字符串结束标志,就一直循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-23 16:48:30 | 显示全部楼层
jackz007 发表于 2020-12-23 15:56
这个循环是用来计算字符串 a 的长度的,其作用与

       完全相同。

谢谢大神!我刚刚仔细翻看了我c语言书,补上了我很多知识漏洞。不过我还是花了近一个小时的时间才能理解你的每条代码的含义,我深知自己C 语言能力,尤其是自己编程能力能力有很大的不足,昨天考试,思路愣是绞在里面了,想请教大神:如何提升自己这部分能力?(我虽然是一个女生,但我希望我的能力能远远甩开班上同学,未来能成为一个优秀的程序员!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 16:49:42 | 显示全部楼层
#include <stdio.h>
#include <string.h>

void fun(char * a)
{
        int c , i , j , m                        ;
        for(m = 0 ; a[m] ; m ++)                 ;  /*m是用来记该字符串的个数,当a[m]='\0'时,循环截止*/
        for(i = 0 ; i < m && a[i] == '*' ; i ++) ;  /*该行是用来跳过该字符串开头处的 *的,用i++表示首字母的下标*/
        for(c = 0 , j = i ; i < m ; i ++)
                {
                if(a[i] != '*')
                                {
                        a[j ++] = a[i]           ;
                        if(c) c = 0              ;  /*当a[i]为字符时将其打印出来,用a[j]表示,并将c定义为0*/
                }
                                else  c ++                       ;  /*当a[i]为*时,将c进行+1操作,c实则是用来表示该字符串尾部的*个数 */
        }
        for(i = 0 ; i < c ; i ++) a[j ++] = '*'  ;  /*此行用于输出尾部的*号*/
        a[j] = '\0'                              ;  /*此行用于输出最后一个结尾标志字符\0*/
}

main()
{
   char s[81]                                    ;
   printf("Enter a string: ")                    ;
   gets(s)                                       ;
   fun(s)                                        ;
   printf("The string after deleted:\n")         ;
   puts(s)                                       ;
}



更新一波(自己的理解,若有不对,还望各位不吝赐教)~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 17:07:48 | 显示全部楼层
肚子饿了233 发表于 2020-12-23 16:48
谢谢大神!我刚刚仔细翻看了我c语言书,补上了我很多知识漏洞。不过我还是花了近一个小时的时间才能理解 ...

      原来是一个 PL  mm,荣欣直至!
      学语言不能仅仅停留在能看懂书上的代码,关键是,必须自己能够默写出来,这样才能把知识真正变成自己的。还有就是多看别人的代码,看看有哪些知识、经验、技巧值得学习,把那些对自己有促进有启发的代码专门保存到自己的样本代码库中,以便随时查阅和借鉴。
      计算机语言是一门实践第一的学问,多敲代码,多练习多思考永远是正确的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-23 17:50:29 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-12-23 17:07
原来是一个 PL  mm,荣欣直至!
      学语言不能仅仅停留在能看懂书上的代码,关键是,必须自己 ...

谢谢大神!受益匪浅!我会继续加油的( _)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 23:24:11 | 显示全部楼层

刚刚听了大神的话,默写了一遍,发现能正常运行,非常开心!但是我有一个小疑惑,就是第18行a[j]='\0',这条为啥不是a[j++]='\0'呢?结束地址的下标不应该向右移动一个吗?但是我发现好这两种写法都能正常运行,好困惑呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 23:40:22 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-23 23:43 编辑
肚子饿了233 发表于 2020-12-23 23:24
刚刚听了大神的话,默写了一遍,发现能正常运行,非常开心!但是我有一个小疑惑,就是第18行a[j]='\0',这 ...


        两种写法中,前者是直接为 a[j] 赋值为字符串结束标志字符 '\0',这样,j 的数值就正好是字符串 a 的长度;后一种写法与前一种的区别是,赋值后,变量 j 的值又自增了 1。这样 j 的数值就不等于字符串 a 的长度了。具体哪一种写法更好,取决于在接下来的代码中,j 的用途。在本例中,这是函数的最后一条语句,j 自然就没有用了,所以,两种写法的效果完全一样,显然都是正确的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-24 00:01:40 | 显示全部楼层
jackz007 发表于 2020-12-23 23:40
两种写法中,前者是直接为 a[j] 赋值为字符串结束标志字符 '\0',这样,j 的数值就正好是字符 ...

嗯嗯,刚刚使用了搜索引擎,我发现一个问题,就是这个结束标志的问题。因为该题第17行代码中a[j++]='*',即输出该字符串中最后一个*,此刻需要引入结束语句标志\0,为啥可以不移动下标呢?如果不移动下标的话,那最后一个内存中的*可以和\0共存吗?问题描述得有点迷糊,请见谅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-24 00:15:37 From FishC Mobile | 显示全部楼层
肚子饿了233 发表于 2020-12-24 00:01
嗯嗯,刚刚使用了搜索引擎,我发现一个问题,就是这个结束标志的问题。因为该题第17行代码中a[j++]='*', ...


        语句
a[j ++] = '*' 
        是在为 a[j] 赋值后,j 自增数值 1,已经指向了下一个元素的存储单元,所以,后来语句
a[j] = '\0'
         在添加字符串结束标志字符的时候,是添加在一个空位上,而并非是一个已经写被了 '*' 的存储单元上。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-24 07:50:43 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-12-24 00:15
语句

        是在为 a[j] 赋值后,j 自增数值 1,已经指向了下一个元素的存储单元,所以, ...

谢谢大神>o<
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 08:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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