C语言考试题!跪求大神解答!
规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是将字符串中的*号全部删除,前导和尾部的*号不删除。例如输入字符串”******abcAf**G**”,输出为******abcAfG**。在fun函数中填写。#include<stdio.h>
voidfun( char *a)
{
/*大大的问号?*/
}
main()
{
char s;
printf(“Enter a string:\n”);
gets(s);
fun(s);
printf(“The string after deleted:\n”);
put(s);
} #include <stdio.h>
#include <string.h>
void fun(char * a)
{
int c , i , j , m ;
for(m = 0 ; a ; m ++) ;
for(i = 0 ; i < m && a == '*' ; i ++) ;
for(c = 0 , j = i ; i < m ; i ++) {
if(a != '*') {
a = a ;
if(c) c = 0 ;
} else {
c ++ ;
}
}
for(i = 0 ; i < c ; i ++) a = '*';
a = '\0' ;
}
main()
{
char s ;
printf("Enter a string: ") ;
gets(s) ;
fun(s) ;
printf("The string after deleted:\n") ;
puts(s) ;
} jackz007 发表于 2020-12-22 21:44
大神,你能把你的程序思路简单介绍一下吗?我不是很懂{:5_100:} 观摩上面大神写的.....自己写的,调试了几次本来是从位置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 != '*')
{
start=i;
break;
}
}
for(i=0;i<80;i++)
{
if(a=='\0')
{
end=i;
break;
}
}
for(j=end;j>=0;j--)//从后面开始找到不是*的位置j
{
if(a != '*' && a != '\0')
{
break;
}
}
printf("start=%d,end=%d\n",start,j);
for(i=start;i<j;i++)
{
if(a=='*')
{
for(start=i;start<80;start++)
{
a=a;
}
i--;
j--;
}
}
}
main()
{
char s;
printf("Enter a string:\n");
gets(s);
fun(s);
printf("The string after deleted:\n");
puts(s);
} 有没有大神帮看看我的程序有什么优化没有?或者有什么问题
#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 != '*')
{
start=i;
break;
}
}
for(i=0;i<80;i++)
{
if(a=='\0')
{
end=i;
break;
}
}
for(j=end;j>=0;j--)//从后面开始找到不是*的位置j
{
if(a != '*' && a != '\0')
{
break;
}
}
printf("start=%d,end=%d\n",start,j);
for(i=start;i<j;i++)
{
if(a=='*')
{
for(start=i;start<end;start++)//往前挪动
{
a=a;
}
i--;
j--;
end--;
}
}
}
main()
{
char s;
printf("Enter a string:\n");
gets(s);
fun(s);
printf("The string after deleted:\n");
puts(s);
} 本帖最后由 jackz007 于 2020-12-22 23:54 编辑
肚子饿了233 发表于 2020-12-22 23:35
大神,你能把你的程序思路简单介绍一下吗?我不是很懂
先用一个循环跨过字符串开头的所有 '*' 字符
从第一个非 '*' 开始,再设计一个循环,循环变量继续是 i ,用于遍历字符串的每一个字符,同时新增加一个下标变量 j,专门用来写字符。如果在循环中没有删除字符,那么,i 和 j 将一直相等,但是,如果有,那就会不一样。在循环中,始终只复制非 '*' 字符,遇到 '*' 字符时,用变量 e 进行计数,在遇到非 '*' 字符时将 e 清零,这样,当循环结束的时候,只要看看 e 的数值,就可以知道字符串的末尾有几个 '*' 字符,专门用循环把这些 '*' 字符悉数补到字符串的末尾就可以了。
jackz007 发表于 2020-12-22 23:52
先用一个循环跨过字符串开头的所有 '*' 字符
从第一个非 '*' 开始,再设计一个循环, ...
完美 不懂就问? for(m = 0 ; a ; m ++) 这行代码里a这条判断语句是怎么理解的呀?
{:5_100:} 本帖最后由 jackz007 于 2020-12-23 15:57 编辑
肚子饿了233 发表于 2020-12-23 15:47
不懂就问? for(m = 0 ; a ; m ++) 这行代码里a这条判断语句是怎么理解的呀?
这个循环是用来计算字符串 a 的长度的,其作用与
m = strlen(a) ;
完全相同。
此循环中间的条件 a ,实际上等同于下面的表达
a != '\0'
也就是说,只要 a 不是字符串结束标志,就一直循环。
jackz007 发表于 2020-12-23 15:56
这个循环是用来计算字符串 a 的长度的,其作用与
完全相同。
谢谢大神!我刚刚仔细翻看了我c语言书,补上了我很多知识漏洞。不过我还是花了近一个小时的时间才能理解你的每条代码的含义,我深知自己C 语言能力,尤其是自己编程能力能力有很大的不足,昨天考试,思路愣是绞在里面了,想请教大神:如何提升自己这部分能力?(我虽然是一个女生,但我希望我的能力能远远甩开班上同学,未来能成为一个优秀的程序员!{:5_111:}) #include <stdio.h>
#include <string.h>
void fun(char * a)
{
int c , i , j , m ;
for(m = 0 ; a ; m ++) ;/*m是用来记该字符串的个数,当a='\0'时,循环截止*/
for(i = 0 ; i < m && a == '*' ; i ++) ;/*该行是用来跳过该字符串开头处的 *的,用i++表示首字母的下标*/
for(c = 0 , j = i ; i < m ; i ++)
{
if(a != '*')
{
a = a ;
if(c) c = 0 ;/*当a为字符时将其打印出来,用a表示,并将c定义为0*/
}
elsec ++ ;/*当a为*时,将c进行+1操作,c实则是用来表示该字符串尾部的*个数 */
}
for(i = 0 ; i < c ; i ++) a = '*';/*此行用于输出尾部的*号*/
a = '\0' ;/*此行用于输出最后一个结尾标志字符\0*/
}
main()
{
char s ;
printf("Enter a string: ") ;
gets(s) ;
fun(s) ;
printf("The string after deleted:\n") ;
puts(s) ;
}
更新一波(自己的理解,若有不对,还望各位不吝赐教)~~ 肚子饿了233 发表于 2020-12-23 16:48
谢谢大神!我刚刚仔细翻看了我c语言书,补上了我很多知识漏洞。不过我还是花了近一个小时的时间才能理解 ...
原来是一个 PLmm,荣欣直至!
学语言不能仅仅停留在能看懂书上的代码,关键是,必须自己能够默写出来,这样才能把知识真正变成自己的。还有就是多看别人的代码,看看有哪些知识、经验、技巧值得学习,把那些对自己有促进有启发的代码专门保存到自己的样本代码库中,以便随时查阅和借鉴。
计算机语言是一门实践第一的学问,多敲代码,多练习多思考永远是正确的。 jackz007 发表于 2020-12-23 17:07
原来是一个 PLmm,荣欣直至!
学语言不能仅仅停留在能看懂书上的代码,关键是,必须自己 ...
谢谢大神!受益匪浅!我会继续加油的( _) jackz007 发表于 2020-12-22 21:44
刚刚听了大神的话,默写了一遍,发现能正常运行,非常开心!但是我有一个小疑惑,就是第18行a='\0',这条为啥不是a='\0'呢?结束地址的下标不应该向右移动一个吗?但是我发现好这两种写法都能正常运行,好困惑呀{:5_99:} 本帖最后由 jackz007 于 2020-12-23 23:43 编辑
肚子饿了233 发表于 2020-12-23 23:24
刚刚听了大神的话,默写了一遍,发现能正常运行,非常开心!但是我有一个小疑惑,就是第18行a='\0',这 ...
两种写法中,前者是直接为 a 赋值为字符串结束标志字符 '\0',这样,j 的数值就正好是字符串 a 的长度;后一种写法与前一种的区别是,赋值后,变量 j 的值又自增了 1。这样 j 的数值就不等于字符串 a 的长度了。具体哪一种写法更好,取决于在接下来的代码中,j 的用途。在本例中,这是函数的最后一条语句,j 自然就没有用了,所以,两种写法的效果完全一样,显然都是正确的。 jackz007 发表于 2020-12-23 23:40
两种写法中,前者是直接为 a 赋值为字符串结束标志字符 '\0',这样,j 的数值就正好是字符 ...
嗯嗯,刚刚使用了搜索引擎,我发现一个问题,就是这个结束标志的问题。因为该题第17行代码中a='*',即输出该字符串中最后一个*,此刻需要引入结束语句标志\0,为啥可以不移动下标呢?如果不移动下标的话,那最后一个内存中的*可以和\0共存吗?问题描述得有点迷糊,请见谅{:5_96:} 肚子饿了233 发表于 2020-12-24 00:01
嗯嗯,刚刚使用了搜索引擎,我发现一个问题,就是这个结束标志的问题。因为该题第17行代码中a='*', ...
语句
a = '*'
是在为 a 赋值后,j 自增数值 1,已经指向了下一个元素的存储单元,所以,后来语句
a = '\0'
在添加字符串结束标志字符的时候,是添加在一个空位上,而并非是一个已经写被了 '*' 的存储单元上。
jackz007 发表于 2020-12-24 00:15
语句
是在为 a 赋值后,j 自增数值 1,已经指向了下一个元素的存储单元,所以, ...
谢谢大神>o<
页:
[1]