标题:题目是:在主函数输入十个等长的字符串,用另一函数对他们进行排序,然后在 ...
只看楼主
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
结帖率:85.71%
已结贴  问题点数:20 回复次数:13 
题目是:在主函数输入十个等长的字符串,用另一函数对他们进行排序,然后在主函数输出十个排好序的字符串
代码有点长,问题确认出现在函数里,算法粗糙,见谅:
#include <stdio.h>
#include <string.h>
 static void rank(char *p) ;
 int main()
 {
     char str[10][10];
     int i;
     char*p=str[0];
     printf("please input ten strings each has ten characters:\n");
     for(i=0;i<10;i++)
     {
      printf("str%d:",i+1);
     gets(str[i]);
     }
     rank(p);
     printf("After ranking the ten strings are:");
     for(i=0;i<10;i++)
     printf("\nstr%d:%s",i+1,str[i]);
     return 0;
 }
 static void rank(char*p)
 {
     int i,j,k=0;
     char temp[10];
     for(i=0;i<9;i++)//temp是用来作中转的,一个中间值
     {
         k=i;
         for(j=i+1;j<10;j++)
         if(strcmp(*(&p+k),*(&p+j))>0)//只是为了多用下指针知识,所以写成这么麻烦的语句,见谅
         k=j;
         if(k!=i)
         {
             strcpy(temp,*(&p+i));
             strcpy(*(&p+i),*(&p+k));
             strcpy(*(&p+k),temp);
         }
     }
 }
编译不存在问题,但输入完十个字符串后,enter,系统提示   ...exe停止运行,请指出问题在哪
搜索更多相关主题的帖子: please include return 字符串 
2017-02-12 19:47
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:3 
字符串排序交换指针就行了,不需要倒腾内容。

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

void qsort(char *s[],int n);

int main(void)
{
    char nline[200],line[MAXLINE];
    char *maxline[MAXLINE];
    char *p_line;
    int size,i,j;
    p_line = nline;

    for(i = 0; i < MAXLINE && gets(line) && line[0] != '\0';i++)
    {
        size = strlen(line);
        strcpy(p_line,line);
        maxline[i] = p_line;
        p_line += size + 1;
    }
    qsort(maxline,i);

    for(j = 0; j < i;j++)
        puts(maxline[j]);
    return 0;
}

void qsort(char *s[],int n)
{
    char *temp;
    int i,j;

    for(i = 0;i < n; i++)
        for(j = i; j < n; j++)
            if(strcmp(s[i],s[j]) > 0)
            {
                temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
}


[此贴子已经被作者于2017-2-12 20:47编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-12 20:32
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 2楼 renkejun1942
额,你的这个方法我弄过,因为有两道一样的题,要求用不同的方法,所以我这次交换内容,只是想拐弯磨脚地多用下指针知识。
所以能否正面回答,就是不改动我的代码,检查下语法错误到底在哪??

............
2017-02-13 15:30
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
得分:4 
正是你自己想得拐弯抹角然后就错了,
char*p=str[0]; 这一步p拿到str[0]的地址, p+2就是str[2]的地址
你原来写得 *(&p+k) 想想是没有问题, 但是 &p+k 得到的是什么 ,
这样算是正面回答么?
程序代码:
 for(j=i+1;j<10;j++)
         if(strcmp((p+k),(p+j))>0)//
         k=j;
         if(k!=i)
         {
             strcpy(temp,(p+i));
             strcpy((p+i),(p+k));
             strcpy((p+k),temp);
         }

早知做人那么辛苦!  当初不应该下凡
2017-02-13 16:17
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:10 
这还是数组指针和指针数组概念没弄清楚,像你这样定义了一个二维数组,则必须用一个数组指针来指向(相当于二维数组、二级指针),如:char (*p)[10]=&str[0];如果非要像你这样用单级指针来做这个题目,代码修改如下可通过(我将你的字符串数组长度调整为50,10个字母太少了):
程序代码:
#include <stdio.h>
#include <string.h>
static void rank(char *p) ;
int main()
{
    char str[10][50];
    int i;
    char*p=str[0];
    printf("please input ten strings each has ten characters:\n");
    for(i=0;i<10;i++)
    {
        printf("str%d:",i+1);
        gets(str[i]);
    }
    rank(p);
    printf("After ranking the ten strings are:");
    for(i=0;i<10;i++) 
        printf("\nstr%d:%s",i+1,str[i]);
    printf("\n");
    return 0;
}
static void rank(char*p)
{
    int i,j,k=0;
    char temp[50];
    for(i=0;i<9;i++)//temp是用来作中转的,一个中间值
    {
        k=i;
        for(j=i+1;j<10;j++)
            if(strcmp(p+k*50,p+j*50)>0)//只是为了多用下指针知识,所以写成这么麻烦的语句,见谅
                k=j;
            if(k!=i)
            {
                strcpy(temp,p+i*50);
                strcpy(p+i*50,p+k*50);
                strcpy(p+k*50,temp);
            }
    }
}
收到的鲜花
  • 炎天2017-02-13 19:24 送鲜花  6朵   附言:好文章
2017-02-13 16:44
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 4楼 炎天
谢谢答复,但觉得版主考虑失误,犯了低级错误,p+2应该是str[0][2]才对,因为p是列指针。
我运行了如下程序以论证:
#include <stdio.h>
int main()
{
    char str[3][3]={"abe","cdf","ghi"};
    char*p=str[0];
    printf("%s",p+2);
}
如果您说的是对的,那么应该输出ghi,而实际结果是ecdfghi,所以好像错误也不在这,希望版主考虑仔细些,其实我加&p+2是把p转为行指针,指向str[0]所在那行,这样+2后就是str[2]所在那行的地址。

............
2017-02-13 16:48
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
*(*(p+n)+i)

这样会不会更清晰一些?!

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-13 18:19
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 5楼 xzlxzlxzl
版主这想法不错,我决定用你的方法,但还是想知道您把我代码替换的部分,不是和我的等价吗?
for(i=0;i<9;i++)//temp是用来作中转的,一个中间值
     {
         k=i;
         for(j=i+1;j<10;j++)
         if(strcmp(*(&p+k),*(&p+j))>0)//只是为了多用下指针知识,所以写成这么麻烦的语句,见谅
         k=j;
         if(k!=i)
         {
             strcpy(temp,*(&p+i));
             strcpy(*(&p+i),*(&p+k));
             strcpy(*(&p+k),temp);
         }
     }
比如*(&p+k),p原来是列指针,代表str[0][0],加上&变成行指针,代表str[0]所在一行地址,加上k就变成str[k]所在一行的地址,最后加上*将行指针变为列指针,即代表str[k][0],这和版主的p+k*50道理是一样的,只不过我直接采用行指针运算,版主采用列指针运算,我说的哪里错了??

............
2017-02-13 18:36
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 7楼 renkejun1942
额,您说的这个我也知道,如果真的想解答我的问题请看我对5楼的回复吧,相当于我问题浓缩版

............
2017-02-13 18:38
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 5楼 xzlxzlxzl
还有,为什么我将你的50改为我的10,其他和你的一样,然后每行输入十个字母,就会停止运行,而50却不会

............
2017-02-13 20:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-474161-1-1.html




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

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