| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5134 人关注过本帖
标题:请帮忙看下,如何输入知道文件结束。
只看楼主 加入收藏
ybj159687318
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-12-12
结帖率:0
收藏
已结贴  问题点数:20 回复次数:9 
请帮忙看下,如何输入知道文件结束。
您好!我有两个问题想问您。

第一个问题描述
输入若于书名,每个书名长度不超过100,将书按ASCII顺序,从小到大排序。
输入
输入书名个数不定,直到文件结束为止。
输出
将字符串按ASCII码从小到大排序后输出。
输入样列
Java
Basic
C#
Fortran
Delphi
输出样例
Basic
C#
Delphi
Fortran
Java


我的程序:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
void SortStr(char *a[],int n){
    char b[100],*temp=(char*)malloc(sizeof(char)*200);
    int i,j;
    for(i=0;i<n-1;i++)
       for(j=i+1;j<n;j++)
          if(strcmp(a[i],a[j])>0){
              strcpy(temp,a[j]);
              strcpy(a[j],a[i]);
              strcpy(a[i],temp);
          }
       free(temp);
}
int main(void){
    char p[200],*q[200];
    int i,n=0;
    scanf("%s",p);
    while(p[0]!='#'){
        q[n]=(char*)malloc(sizeof(char)*strlen(p));
        strcpy(q[n],p);
        scanf("%s",p);
        n++;
    }
    SortStr(q,n);
    for(i=0;i<n;i++){
        printf("%s\n",q[i]);
        free(q[i]);
    }   
    return 0;
}

第二个问题描述
输入若于书名,每个书名长度不超过100,将书按ASCII顺序,从小到大排序。
 
请注意:这些书名中可能有“空格”。
输入
第一个为字符串个数m,然后输入m个书名。
输出
将字符串按ASCII码从小到大排序后输出。
输入样列
5
Java
Basic
C#
Fortran
Delphi

输出样例
Basic
C#
Delphi
Fortran
Java

我的程序:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
void SortStr(char *a[],int n){
    char b[100],*temp=(char*)malloc(sizeof(char)*100);
    int i,j;
    for(i=0;i<n-1;i++)
       for(j=i+1;j<n;j++)
          if(strcmp(a[i],a[j])>0){
              strcpy(temp,a[j]);
              strcpy(a[j],a[i]);
              strcpy(a[i],temp);
          }
       free(temp);
}

int main(void){
    char b,p[100],*q[100];
    int i,n;
    scanf("%d",&n);
    getchar();
    if(n>200){
        printf("Overflow!");
        return 0;
    }
    for(i=0;i<n;i++){
        scanf("%s",p);
        q[i]=(char*)malloc(sizeof(char)*strlen(p));
        strcpy(q[i],p);
    }
    SortStr(q,n);
    for(i=0;i<n;i++){
        printf("%s\n",q[i]);
        free(q[i]);
    }   
    return 0;
}

您能帮我看看哪错了吗?
搜索更多相关主题的帖子: 如何 字符串 include 
2015-12-12 20:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如何知道文件结束?约定结束规则啊。比如约定某个特殊输入动作就是结束了,用句号可以,用#也可以,用系统内定的“文件出错符”(即所谓的EOF约定符,Windows系统通过按Ctrl+Z输入,?inux系统用Ctrl+D输入,也是约定,系统遇到这些字符,就会返回EOF给程序)也可以。

其实,你程序二那个先输入5的动作,也是一种约定。无论无何,都必须有约定,如何约定,却是自由的。

[此贴子已经被作者于2015-12-12 20:18编辑过]


授人以渔,不授人以鱼。
2015-12-12 20:14
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:7 
文不对题,目测数据循环输入那里会出问题,书名有空格可以用fgets代替输入吧,第一次看到有人拿串拷贝来做排序的

我们都在路上。。。。。
2015-12-12 20:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
他就是不知道怎么结束循环

授人以渔,不授人以鱼。
2015-12-12 20:38
ybj159687318
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-12-12
收藏
得分:0 
可以帮我修改一下吗?
2015-12-13 11:52
ybj159687318
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-12-12
收藏
得分:0 
回复 3楼 hellovfp
可以帮我修改一下吗?
2015-12-13 11:53
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
你第一个已经约定输入“#”号结束,第二个自动接收5个结束,都有结束循环的条件。你的错误在排序,由于你申请的堆都恰好是书名的长度,所以你使用排序时不应该用strcpy函数实际交换书名,应该直接交换指针q即可,否则会出现书名长的拷贝至书名短的堆时出现数据溢出,程序即中断排序。

能编个毛线衣吗?
2015-12-13 12:18
ybj159687318
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-12-12
收藏
得分:0 
回复 7楼 wmf2014
可以帮我修改好吗?
还有那个第一题不能输入#来结束,运行时只能输入书名
2015-12-13 17:08
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:7 
回复 8楼 ybj159687318
如果不能用#来结束,也可以设定输入一空行作为结束标志,这时需要换成gets输入,同时要把字符串排序也改下,修改后代码如下:
程序代码:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
void SortStr(char *a[],int n)
{
    char *p;
    int i,j;
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(strcmp(a[i],a[j])>0)
            {
                p=a[i];
                a[i]=a[j];
                a[j]=p;
            }
        }
    }
}
int main(void){
    char p[200],*q[200];
    int i,n;
    for(i=1,n=0;i;)
    {
        flushall();
        gets(p);
        i=strlen(p);
        if(i)
        {
            q[n]=(char*)malloc(i+1);
            strcpy(q[n],p);
            n++;
        }
    }
    SortStr(q,n);
    for(i=0;i<n;i++){
        printf("%s\n",q[i]);
        free(q[i]);
    }
    return 0;
}


能编个毛线衣吗?
2015-12-13 19:17
ybj159687318
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-12-12
收藏
得分:0 
flushall();
这个运行不了
2015-12-17 15:37
快速回复:请帮忙看下,如何输入知道文件结束。
数据加载中...
 
   



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

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