| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 413 人关注过本帖
标题:换看一本c书,有些问题,望大虾指导!
只看楼主 加入收藏
xinbuzai
Rank: 1
等 级:新手上路
帖 子:29
专家分:8
注 册:2010-7-2
结帖率:60%
收藏
已结贴  问题点数:20 回复次数:7 
换看一本c书,有些问题,望大虾指导!
1楼



第四道题:编辑一程序把它的输入复制到输出,并在此过程将相连的多个空格用一个空格代替。



希望那位朋友帮我把上面的题做一下,我做了一下午没做出来

include<stdio.h>
#include<string.h>
main()
{
    long int c;
    int i=0,t;
    char a[80],*q,*p;
      c=getchar();
   while(c!=EOF)
      {a[i]=c;i++;c=getchar();}
         a[i]='\0';
     q=a; /* 把a的地址赋值给指针p */
    while(*q!='\0')
    {
       while(*q!=' ')q++;/* 跳过前面的字符,除空格 */
       if(*q==' '&&*(q+1)==' ')
       {   p=q+1;
          while(*p!='\0')
          {
             *p=*(p+1);
             p++;
          }
       }
       q++;
    }
     puts(a);
    getch();

这个程序功能没达到呀!只能删一个空格!

[ 本帖最后由 xinbuzai 于 2010-7-13 17:21 编辑 ]
搜索更多相关主题的帖子: 指导 
2010-07-13 09:39
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:10 
EOF 就是 End Of File  由操作系统操作查看是没有更多的资料读取
如果是手动输入 c=getchar()!=EOF 基本上 要输入EOF 才能让其终止循环
在控制台 输入EOF 的方法是 按住ALT 然后输入数字65535 回车 再回车 就可以OUT了

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-13 10:44
xinbuzai
Rank: 1
等 级:新手上路
帖 子:29
专家分:8
注 册:2010-7-2
收藏
得分:0 
有没有人帮我把第四道题做一下呀!我做了半天也没做出来!
2010-07-13 17:19
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:10 
#include <stdio.h>

int main()
{
    char input[100];
    char output[100] = "";
    int i=0;
    int j=0;
   
    gets(input);
   
    for(;i<sizeof(input);i++){
        if(!(input[i]==' '&&input[i+1]==' ')){
            output[j] = input[i];
            j++;
        }
    }
    puts(output);
    return 0;
}

只有当该位置和下一位置都是空格时,才不会复制该位置字符,即只保留一堆空格的最后一个空格
2010-07-13 18:18
xinbuzai
Rank: 1
等 级:新手上路
帖 子:29
专家分:8
注 册:2010-7-2
收藏
得分:0 
#include<stdio.h>
#include<string.h>
main() {
    long int c;
    int i=0;
    char a[80],*q,*p;
    c=getchar();
    while(c!=EOF)
    {
        a[i]=c;
        i++;
        c=getchar();
    }
    a[i]='\0';/* 把字符串输入到数组a中 */

    q=a; /* 把a的地址赋值给指针p */
    while(*q!='\0')
    {
        while(*q!=' ')q++;/* 跳过前面的字符,除空格 */
        while(*q==' '&&*(q+1)==' ')/* 判断是否有两个空格相连,如果有,则执行循环体 */
        {
            p=q+1;

            while(*p!='\0')
            {
                *p=*(p+1);
                p++;
            }/* 整体顺序前移第二个格后的字符串*/

        }/* 当移动后如果第一个字符不是空格,则终止循环 */
        q++;
    }
    puts(a);
    getch();
}
搞好了!还有更简单的方法!
2010-07-13 18:30
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:0 
能不能把更简单的方法发出来?
2010-07-13 19:08
xinbuzai
Rank: 1
等 级:新手上路
帖 子:29
专家分:8
注 册:2010-7-2
收藏
得分:0 
题目:编辑一个程序,把输入复制到输出,如果输入过程中有连续多个空格相连,则只输出一个空格!以下是我写出的五个程序,当然有zotin的点拨,更多的是自己的思考!希望能对像我一样的初学者一定的思考。

方法一:

#include<stdio.h>
#include<string.h>
main()
{
   long int c;
   int i=0,t;
   char a[80];
   int firstSpace = 1;
   c=getchar();
   while(c!=EOF)
   {
      if(c==' '&&firstSpace)
      {
         a[i++]=c;firstSpace=0;
       }
      if(c!=' ')
      {
         a[i++]=c;firstSpace=1;
      }
      c=getchar();
   }
   a[i] = '\0';
   puts(a);
   getch();
}





方法二:

#include<stdio.h>
#include<string.h>

main()
{
   long int c;
   int i=0,t;
   char a[80];
   int firstSpace = 1;
   c=getchar();
   while(c!=EOF)
   {
      if (c != ' '||firstSpace  )/* c不是空格则赋值到数组元素中,如果是空格,
      则看firstSpace是不是真,是真说明是第一个空格,同样地赋值到数组中,
      如果不是真说明不是第一个空格,则忽略不记 */
      {
         a[i]=c;
         i++;
         firstSpace = 0;/* 这里当c不是空格也把firtspace设为0,是不合理的 */
      }
      if(c != ' ') /*当c不是空格时,firstSpace置1,这样做的目的是当时遇到下一个空格,
      那么这个空格就是第一个空格  */
      {
         firstSpace = 1;
      }
      c=getchar();
   }
   a[i] = '\0';
   puts(a);
   getch();
}


方法三#include<stdio.h>
#include<string.h>
main() {
    long int c;
    int i=0;
    char a[80],*q,*p;
    c=getchar();
    while(c!=EOF)
    {
        a[i]=c;
        i++;
        c=getchar();
    }
    a[i]='\0';/* 把字符串输入到数组a中 */
/* 程序思想:程序从头往后测试字符串的每一个字符,a不是空格则跳过;b当遇到空格,
则再判断紧接这个空格后的字符是不是空格,c如果是,则把这第一个空格后的字符串整体前移,以替换掉空格
,d然后再判断紧接后面是不是空格,是,则再移,如果不是,继续往后测试,重复abcd */
?
    q=a; /* 把a的地址赋值给指针p */
    while(*q!='\0')
    {
        while(*q!=' ')q++;/* 跳过前面的字符,除空格 */
        while(*q==' '&&*(q+1)==' ')/* 判断是否有两个空格相连,如果有,则执行循环体 */
        {
            p=q+1;

            while(*p!='\0')
            {
                *p=*(p+1);
                p++;
            }/* 整体顺序前移第二个格后的字符串*/

        }/* 当移动后如果第一个字符不是空格,则终止循环 */
        q++;
    }
    puts(a);
    getch();
}
方法四:

#include<stdio.h>
#include<string.h>
liuonespace(char *p)
{
   char b[80];
   int i,j=0,firtspace=1;/* 设置空格标志,首先赋初值1 */
   for(i=0;p[i]!='\0';i++)
   {
     if(p[i]!=' '||firtspace) /* 首次不管是遇到空格还是其它都能运行下面的语句 */
      {
        b[j++]=p[i];/*  */
        firtspace=0;
      }
     if(p[i]!=' ')
      {
         firtspace=1;
      }
    }     /* 循环终止条件是遇到字符串结束符 */
    b[j]='\0'; /* 放置字符串结束标志 */
    strcpy(p,b);/* 复制字符串,从b到p,也就是从b到a */
 }
main()
{
   long int c;
   char a[80];
   int i=0;
   c=getchar();
   while(c!=EOF)
   {
      a[i]=c;
      i++;
      c=getchar();
   }
   a[i]='\0';/* 从键盘输入字符串到数组a中 */
   puts(a);
   puts(liuonespace(a));
   getch();
}





方法五:



#include<stdio.h>
#include<string.h>
main()
{
    long int c;
    int i,j,space;
    char a[80],b[80];
    i=0;
    c=getchar();
    while(c!=EOF)
    {
        a[i]=c;
        i++;
        c=getchar();
    }
    a[i]='\0';

    j=0;space=1;
    for(i=0;a[i]!='\0';i++)
    {
       if(a[i]==' '&&space)
       {
          b[j++]=a[i];
          space=0;
       }
       if(a[i]!=' ')
       {
          b[j++]=a[i];
          space=1;
       }
    }
    b[j]='\0';
    puts(b);
    getch();
 }
2010-07-13 23:31
xinbuzai
Rank: 1
等 级:新手上路
帖 子:29
专家分:8
注 册:2010-7-2
收藏
得分:0 
回复 4楼 sidooh
哈哈哈,兄弟的算法更直接。不过,我在做这题时,在用EOF!
2010-07-13 23:43
快速回复:换看一本c书,有些问题,望大虾指导!
数据加载中...
 
   



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

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