| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2410 人关注过本帖
标题:请问这个代码为什么不能正常运行
只看楼主 加入收藏
焬天
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2017-12-15
结帖率:50%
收藏
 问题点数:0 回复次数:5 
请问这个代码为什么不能正常运行
对输入的8个字符串(每个字符串长度不超过20)按照字典顺序进行排序并输出。不限定排序方法,不能使用goto语句。

#include <stdio.h>
int main()
{
    char t[8];
    char p;   
    int i,j;
    for(i=0;i<8;i++)
    {
        scanf("%s",&t[i]);
    }
    for(i=0;i<8;i++)
    {
        for(j=i+1;j<8;j++)
         {
          if (t[i]>t[j])
          {      
            p=t[i];   
            t[i]=t[j];
            t[j]=p;
          }
        }
         printf("%s\n",t[i]);
    }
    return 0;
}
搜索更多相关主题的帖子: 代码 运行 int char for 
2018-01-07 15:53
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
先写个输入部分
#include <stdio.h>
int main()
{
    char t[8][21];
    int i;
    for(i=0;i<8;i++)
        scanf("%s", t[i]);
    for(i=0;i<8;i++)
        printf("%s\n", t[i]);
}

2018-01-07 19:11
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
还有说一句字符串交换是指针交换还是内容交换?~
指针交换的话要用到指针数组才行,当然是指针交换效率比较高
不限定排序方法的话,吃个瓜压压惊先~

程序代码:
#include <stdio.h>
#include<string.h>

#define N 8
#define LEN 21
#define SIZE(l) (sizeof (l)/sizeof (*l))

#define FOR_EACH(i,time)    \
    for (i=0;i!=time;++i)

int Comp(const void* p1,const void* p2);

void Input(char* s,size_t size);

int main( void )
{
    char t[N][LEN]; 

    size_t i;
    
    FOR_EACH(i,SIZE(t))
        Input(t[i],SIZE(t[i]));
    
    qsort(t,SIZE(t),SIZE(*t),Comp);
    
    FOR_EACH(i,SIZE(t))
        puts(t[i]);
        
    return 0;
}

int Comp(const void* p1,const void* p2)
{
    return strcmp(p1,p2);
}

void Input(char* s,size_t size)
{
        char* p;
        fgets(s,size,stdin);
        
        if ((p=strchr(s,'\n'))!=NULL)
            *p='\0';
        else
            while (getchar()!='\n');
}


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-01-07 19:42
min624132806
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2017-2-20
收藏
得分:0 
     scanf("%s",&t[i]);
         printf("%s\n",t[i]);


scanf("%c",&t[i]);
         printf("%c\n",t[i]);
S是字符串,c是单个字符。
如果要用S,就要多维数组。
2018-01-07 19:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
PS:注意到一个问题~
strchr函数就算是不加string.h库也是可以用的,不过返回值却是size_t型,加了的话返回的是char*型~

感觉规范的库函数应该要考虑其它库兼容的问题~
不然会可能出现重复定义两次甚至多次的情况~

解决这个问题的其中方法是把每一个函数的前面都用一个唯一的宏定义作为一个标记~
如果遇到重复定义的情况不能通过编译的时候,那么把重复出现的宏去掉就可以了~

例如我上面这个具体点就是
XXX.h
程序代码:

#define XXXXX_COMP_    \
int int Comp(const void* p1,const void* p2);
    
//XXXXX具有唯一性

#define XXXXX_INPUT_    \
void Input(char* s,size_t size);


XXX.c
程序代码:
#ifdef XXXXX_COMP_

int Comp(const void* p1,const void* p2)
{
        return strcmp(p1,p2);
}

#endif

#ifdef XXXXX_INPUT_

void Input(char* s,size_t size)
{
        char* p;
        fgets(s,size,stdin);
        
        if ((p=strchr(s,'\n'))!=NULL)
            *p='\0';
        else
            while (getchar()!='\n');
}

#endif


如果第二个实现文件也定义了
Comp函数例如

#define YYYYY_COMP_    \
int int Comp(const void* p1,const void* p2);

#ifdef YYYYY_COMP_

int Comp(const void* p1,const void* p2)
{
        return strcmp(p1,p2);
}

#endif

这样就会出现重复编译的情况,这时把头文件里面的#define YYYYY_COMP_去掉或者
#undef YYYYY_COMP_就可以了~

感觉加了string.h和不加string.h的函数返回值类型不一致应该是声明部分的接口和定义不一致有关~总之声明可以有多处地方,但实现只能有一处地方~

删去头文件的#define YYYYY_COMP_ 这样可以从根本解决问题,但这样改变主体的结构就不好维护了~
所以还是可以在其所在的头文件里面直接用#undef来解决问题,到时需要的时候只需要删去#undef就可以了~
但这样虽然方便,但还是不能完美解决问题的,因为声明了那个函数不止一次,所以有可能出现函数接口和实现主体参数不一致的情况,所以通常团体合作的时候在写项目的时候要为用到函数帮助文档,里面说明参数类型返回值类型以及基本功能等,还需要保持一致以来达成共识是有必要的~当然这只是在团体合作管理的时候出现,一般情况下个体户自定义函数通常是没有这个必要的~

[此贴子已经被作者于2018-1-7 21:34编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-01-07 20:26
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这段是用指针数组进行排序的~

程序代码:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>

#define N 8
#define LEN 21
#define SIZE(l) (sizeof (l)/sizeof (*l))

#define FOR_EACH(i,time)    \
    for (i=0;i!=time;++i)

int Comp(const void* p1,const void* p2);

void Input(char* s,size_t size);

int main( void )
{
    char t[N][LEN]; 
    char* p[N];

    size_t i;
    size_t j;

    FOR_EACH(i,SIZE(t))
    {
        p[i]=t[i];
        Input(t[i],SIZE(t[i]));
    }

    qsort(p,SIZE(p),SIZE(*p),Comp);
    
    FOR_EACH(i,SIZE(t))
        puts(p[i]);
        
    return 0;
}

int Comp(const void* p1,const void* p2)
{
    const char* s1=(const char*)*(void**)(p1);
    const char* s2=(const char*)*(void**)(p2);
    
    return strcmp(s1,s2);
}

void Input(char* s,size_t size)
{
        char* p;
        fgets(s,size,stdin);
        
        if ((p=strchr(s,'\n'))!=NULL)
            *p='\0';
        else
            while (getchar()!='\n');
}


[此贴子已经被作者于2018-1-9 09:46编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-01-07 23:11
快速回复:请问这个代码为什么不能正常运行
数据加载中...
 
   



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

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