黑马程序员技术交流社区

标题: 一个C的代码,自己没找到错误,但是结果不对,求指点 [打印本页]

作者: Storm_    时间: 2015-10-28 10:40
标题: 一个C的代码,自己没找到错误,但是结果不对,求指点
这是我基础测试时候的一个c的编程题,虽然基础测试给了10分,但是我想搞清楚我这个代码错在哪,求指点~
//9,从键盘输入6个字符串(仅仅包含英文字母和数字),对这6个字符串从小到大排列并输出结果。(C语言)
/*    先接for循环接收用户输入的字符串,然后用两个for循环借用
*    字符串处理函数两两相邻比较,若后者大于前者,则交换两字符串。
*    最后按顺序输出字符串
*/


//   ps:程序运行结果不对,始终没找出错误……

#include <stdio.h>
//调用函数库
#include <string.h>

int main(int argc, const char * argv[]) {
    //定义一个二维字符数组
    char a[6][30];
    //定义一个替换函数
    char temp[30];
    //用for循环接收6次字符串
    for (int i = 0; i < 6; i++) {
        //提示用户输入
        printf("请输入字符串不大于30的第%d个字符串\n",i+1);
        //接收字符串
        scanf("%s",a);
    }
    //外层循环循环5次,
    for (int m=0; m<6; m++) {
        //内层比外层少循环1次
        for (int n=0; n<5-m; m++) {
            //相邻两个字符串进行比较,若strcmp>0,则说明前者大,所以交换两个数
            if (strcmp(a[n], a[n+1])>0) {
                //用strcpy函数交换字符串,后者覆盖前者的字符串内容
                strcpy(temp,a[n]);
                strcpy(a[n],a[n+1]);
                strcpy(a[n],temp);
            }
        }
    }
    //for循环输出结果
    for (int g=0; g<6; g++) {
        printf("%s  ",a[g]);
    }
    return 0;
}


作者: wokua    时间: 2015-10-28 10:40
本帖最后由 wokua 于 2015-10-29 10:16 编辑
Storm_ 发表于 2015-10-28 16:40
上面那个m发热循环写错了,改过来了,还是结果不对

#include
楼主太急了,排序那块写错了,最后一个应该是strcpy(a[n+1],temp);写成了strcpy(a[n],temp);
作者: guoguo291    时间: 2015-10-28 11:50
Storm_ 发表于 2015-10-28 10:40
这是我基础测试时候的一个c的编程题,虽然基础测试给了10分,但是我想搞清楚我这个代码错在哪,求指点~
//9 ...

额,爱莫能助
作者: _let'sgo    时间: 2015-10-28 14:20
亲,您是想用冒泡法吗?
貌似冒泡法应该是
for (int m=0; m<5; m++) {
        //内层比外层少循环1次
        for (int n=0; n<5-m; n++) {
            //相邻两个字符串进行比较,若strcmp>0,则说明前者大,所以交换两个数
            if (strcmp(a[n], a[n+1])>0) {
                //用strcpy函数交换字符串,后者覆盖前者的字符串内容
                strcpy(temp,a[n]);
                strcpy(a[n],a[n+1]);
                strcpy(a[n],temp);
            }
        }
    }


作者: Storm_    时间: 2015-10-28 16:38
_let'sgo 发表于 2015-10-28 14:20
亲,您是想用冒泡法吗?
貌似冒泡法应该是for (int m=0; m0) {                //用strcpy函数交换字符串, ...

那个没注意,改过来了还是不对
作者: Storm_    时间: 2015-10-28 16:40
上面那个m发热循环写错了,改过来了,还是结果不对

#include <stdio.h>

//调用函数库
#include <string.h>

int main(int argc, const char * argv[]) {
    //定义一个二维字符数组
    char a[6][30];
    //定义一个替换函数
    char temp[30];
    //用for循环接收6次字符串
    for (int i = 0; i < 6; i++) {
        //提示用户输入
        printf("请输入字符串不大于30的第%d个字符串\n",i+1);
        //接收字符串
        scanf("%s",a[i]);
    }
    //外层循环循环5次,
    for (int m=0; m<6; m++) {
        //内层比外层少循环1次
        for (int n=0; n<5-m; n++) {
            //相邻两个字符串进行比较,若strcmp>0,则说明前者大,所以交换两个数
            if (strcmp(a[n], a[n+1])>0) {
                //用strcpy函数交换字符串,后者覆盖前者的字符串内容
                strcpy(temp,a[n]);
                strcpy(a[n],a[n+1]);
                strcpy(a[n],temp);
            }
        }
    }
    //for循环输出结果
    for (int g=0; g<6; g++) {
        printf("%s  ",a[g]);
    }
    return 0;
}

作者: 孙明海    时间: 2015-10-28 22:23
scanf("%s",a);接收字符串错误 改为 scanf("%s",a[i]);改了之后你运行一遍  应该没问题了
作者: LOVE毛豆豆    时间: 2015-10-29 01:00
#include <stdio.h>
int maopao(char temp[],int size)
{
    int i,j,temp;
    for(i = size -1; i >=0; i--)
    {
        for(j = size-1; j < size-1-i; i--)
        {
            if(temp[j]<temp[j+1)
            {
                temp = (int)temp[j];
                temp[j] = (int)temp[j+1];
                temp[j+1] = temp;
            }
        }
    }
}
int main()
{
    int i = 0;
    char temp[6] = {0};
    printf("请输入六个字符(1~0、a~z、A~Z)");
    scanf("%s",temp);
    maopao(temp,6);
    printf("%s\n",temp);
}  


作者: LOVE毛豆豆    时间: 2015-10-29 01:04
#include <stdio.h>

int main(int argc, const char * argv[])

{

    //1.从内存中开辟6个100长的字符串空间

    char string1[100];

    char string2[100];

    char string3[100];

    char string4[100];

    char string5[100];

    char string6[100];

   

    //2.新建一个字符串数组,保存各个字符串的地址

    char* stringGroup[6]={string1,string2,string3,string4,string5,string6};



    //3.定义一个变量保存字符串的长度

    unsigned long length[6];

   

    //4.系统提示用户连续输入6个字符串 回车确定

    printf("请依次输入6个字符串,包含数字和字母,回车确定\n");

   

    //5.循环提示用户 连续输入字符串

    for(int i = 0;i < 6;i++)

    {

        

        //5.1提示用户输入第N个字符串

        printf("请输入第%d个字符串\n",(i+1));

        

        //5.2保存第n个字符串到字符串指针数组的n项

        scanf("%s",stringGroup[i]);

   

        //5.3获取相应的字符串的长度并一次保存到长度数组

        length[i] = strlen(stringGroup[i]);

        

    }

作者: LOVE毛豆豆    时间: 2015-10-29 01:05
两种都可以,第一种和你的不太符合。第二种可以。望采纳谢谢
作者: wokua    时间: 2015-10-29 09:08
看你的scanf(),应该是scanf("%s",a[i]);
作者: Storm_    时间: 2015-10-29 15:08
谢谢你啊,自己没找到原因,仔细一看才发现错误,多谢提醒~~
作者: liying    时间: 2015-10-29 22:01
strcpy(a[n],temp)这个改成strcpy(a[n+1],temp)
作者: 秦晓东帅帅哒    时间: 2015-10-29 22:29
scanf("%s",a);接收字符串错误 改为 scanf("%s",a[i]);
作者: 刘辰阳    时间: 2015-10-30 13:21
scanf(),改成scanf("%s",a[i]);
作者: 秦晓东帅帅哒    时间: 2015-11-1 12:34
真速度啊,大神神速
作者: 许本亮    时间: 2015-11-3 15:33
除了strcpy(a[n+1],temp);写成了strcpy(a[n],temp);貌似//内层比外层少循环1次         for (int n=0; n<5-m; m++)应该是n++吧,for(int n = 0; n<5-m; n++)
作者: 后知后觉4778    时间: 2015-12-7 22:17
接受输入的语句出错了,你写的是scanf("%s",a);   二维数组名代表一个地址,在循环里面地址要改变的,应该改成scanf("%s",a[i]);
作者: ydy2511000    时间: 2016-1-7 09:01
#include <stdio.h>
//调用函数库
#include <string.h>

int main(int argc, const char * argv[]) {
    //定义一个二维字符数组
    char a[6][30];
    //定义一个替换函数
    char temp[30];
    //用for循环接收6次字符串
    for (int i = 0; i < 6; i++) {
        //提示用户输入
        printf("请输入字符串不大于30的第%d个字符串\n",i+1);
        //接收字符串
        scanf("%s",a[i]);
    }
    //外层循环循环5次,
    for (int m=0; m<5; m++) {
        //内层比外层少循环1次
        for (int n=0; n<5-m; n++) {
            //相邻两个字符串进行比较,若strcmp>0,则说明前者大,所以交换两个数
            if (strcmp(a[n],a[n+1])>0) {
                //用strcpy函数交换字符串,后者覆盖前者的字符串内容
                strcpy(temp,a[n]);
                strcpy(a[n],a[n+1]);
                strcpy(a[n+1],temp);
            }
        }
    }
    //for循环输出结果
    for (int g=0; g<6; g++) {
        printf("%s  ",a[g]);
    }
    return 0;
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2