| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1181 人关注过本帖
标题:各路神仙帮帮忙,有个问题偶怎么都想不通
只看楼主 加入收藏
雪蓝
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-8-23
结帖率:0
收藏
已结贴  问题点数:20 回复次数:13 
各路神仙帮帮忙,有个问题偶怎么都想不通
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是使字符串中前面的*号不得多于n个,若多于n个,则删除多余的*号,若少于或等于n个,则什么也不做,字符串中间和尾部的*号不删除。
例如:字符串中的内容为****A*BC*DEF*G*******。若n的值为2,删除后,字符串中的内容则应当是**A*BC*DEF*G*******。


下面是我写的程序:
#include <stdio.h>
#include <conio.h>
void fun (char *a,int n)
{char *p=a;
 int i=0;
 while (*p=='*')
 {if(i<=n)
 { a[i++]=*p;
  p++;}
 }
 while (*p)
 {a[i++]=*p;
  p++;
 }
 a[i]='\0';
}
void main ()
{char s[81];int n;
 printf("Enter a string:\n");
 gets(s);
 printf("Enter n:");
 scanf("%d",&n);
 fun(s,n);
 printf("The string after deleted:\n");
 puts(s);
}

运行结果不对,请问fun函数的问题出在哪?
谢谢各位才子佳人!!!!
搜索更多相关主题的帖子: 神仙 
2010-08-23 14:38
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:1 
你的第二个 while错了;你的循环条件是*p!=NULL;应该是*p!='*'

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-08-23 15:33
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:1 
谢谢各位才子佳人!!!!你写的这句话,简称乱写。
由此得知,你写的指针,简称乱指。

说过了,你的第一个while循环 最后得到的是第一个非*的地址。并且也把n范围内的数个*写进了数组。
而第二个while循环,又接着把剩下的字符写进数组,全乱了。

过多改动别人的代码,会让人恨我,所以我想对楼主提个建议:
1:用个while循环算出前面纯*号的总数sum,
2:用这个总数跟N比较,如果sum>N则看第3
3:用得到数组首地址的P,给它个值p=p+(sum-N); p此刻的地址就是所需结果的首地址,printf("%s",p)即可。
如果要返回去,那么就要用数组的移动,从P这个地址开始向前移动sum-N个位置,就可以达到修改数组。


学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-08-23 16:29
燕强
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:78
专家分:188
注 册:2010-8-11
收藏
得分:1 
程序如下。。
#include <stdio.h>
//#include <conio.h>
void fun (char *a,int n)
{
    char *p=a;
    int i=0;
    int end = 0;
    while (*p != '\0')
    {
        if(i  < n )
        {
            a[i++]=*p++;
          }
          else if(end == 0)  /*删除前面连续的'*',但对后面出现的不处理*/
          {
              while(*p == '*')
              {
                  end = 1;
                  p++;
              }
                  
          }
          else
              a[i++] = *p++;
         
    }
    a[i]='\0';
}
int main (void)
{
    char s[81];int n;
    printf("Enter a string:\n");
    gets(s);
    printf("Enter n:");
    scanf("%d",&n);
    fun(s,n);
    printf("The string after deleted:\n");
    puts(s);
    return 0;
}
2010-08-23 16:39
唐小虎
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:46
专家分:119
注 册:2010-6-25
收藏
得分:1 
以下是引用do8do8do8在2010-8-23 16:29:10的发言:

谢谢各位才子佳人!!!!你写的这句话,简称乱写。
由此得知,你写的指针,简称乱指。

说过了,你的第一个while循环 最后得到的是第一个非*的地址。并且也把n范围内的数个*写进了数组。
而第二个while循环,又接着把剩下的字符写进数组,全乱了。

过多改动别人的代码,会让人恨我,所以我想对楼主提个建议:
1:用个while循环算出前面纯*号的总数sum,
2:用这个总数跟N比较,如果sum>N则看第3
3:用得到数组首地址的P,给它个值p=p+(sum-N); p此刻的地址就是所需结果的首地址,printf("%s",p)即可。
如果要返回去,那么就要用数组的移动,从P这个地址开始向前移动sum-N个位置,就可以达到修改数组。
挺死你!!一看你这个就豁然开朗!!他那个程序和你说的没什么两样!!
2010-08-23 21:56
小旬_C
Rank: 2
等 级:论坛游民
帖 子:72
专家分:33
注 册:2010-7-25
收藏
得分:1 
不太明白

没有失败,只有暂时停止成功
2010-08-23 22:05
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:1 
回复 楼主 雪蓝
本来是一个很简单的题目,怎么大家你一言我一语,好像这个问题越说越复杂了???I 服了 YOU !O(∩_∩)O~

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-08-23 22:15
liuchli
Rank: 2
等 级:论坛游民
帖 子:7
专家分:16
注 册:2010-6-12
收藏
得分:1 
#include<stdio.h>
#include<string.h>
void main()
{
     void fun(char *p);
     char str[81];
     puts("please input a string:");
     gets(str);
     fun(str);
}
void fun(char *p)
{
     int n,i;
     char *q;
     q=p;
     printf("Enter num:");
     scanf("%d",&n);
     for(i=0;*q=='*';q++)
           i++;               
     if(i>n)                  
          q=p+i-n;
     else
          q=p;
     puts(q);
}
不知道这样会不会好一点,新手路过!



         
   
2010-08-23 22:58
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
回复 8楼 liuchli
看看我写的,是不是很简洁:
程序代码:
#include <stdio.h>
#include <conio.h>
void fun (char *a,int n)
{
  int i;
  for(i=0;i<=n;i++)     //前n+1个符号内有"*"之外的符号,则返回
     if(a[i]!='*')     
         return ;
  i--;                 //前n+1个符号内没有"*"之外的符号,则i提前下,然后删除一个"*"
  while (a[i]!='\0')   //删除一个"*"
  {
    a[i]=a[i+1];
    i++;
  }
  fun(a,n);             //递归调用,继续删除一个"*",直到满足要求
}

main ()
{char s[81]={0};int n;
printf("Enter a string:\n");
gets(s);
printf("Enter n:");
scanf("%d",&n);
fun(s,n);
printf("The string after deleted:\n");
puts(s);
}
我的思路其实很简单:
1.首先检测字符串开头是否有超过n个的'*',如果没有,结束函数;
2.如果有,则删除第n+1个'*'(删除办法是所有其余字符左移一位),然后返回步骤 1 继续。

[ 本帖最后由 jack10141 于 2010-8-26 00:00 编辑 ]

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-08-23 23:07
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:1 
楼主的思路是可以的,但是忘了在第一个while循环中当i>n时,作p++操作,改成下面这种写法就可以了:
。。。。。。。。   
while (*p=='*')
    {
        if(i<n)
            a[i++]=*p;
        p++;
    }
。。。
2010-08-23 23:22
快速回复:各路神仙帮帮忙,有个问题偶怎么都想不通
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028895 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved