C语言,字符串排序问题

n个字符串按ASCII排序(n< 10),每个子串不超过20个字符

我用的是二维数组,每行表示一个子串,但是不能对第一个子串赋值,第二个可以
图片说明
图片说明

下面是我的代码,是哪里错了呢

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

int cmp(char *str1, char *str2);                  //字符串比较
void swap(char *element1, char *element2);        //字符串交换

int main()
{
    int num, i, m, n;
    char strs[9][21];

    scanf_s("%d", &num);             //输入字符串个数

    for (i = 0; i < num; i++)
    {
        gets(strs[i]);               //依次输入字符串
    }

    for (i = 0; i < num; i++)        //从第一个子串开始遍历
    {
        for (m = 0; m < strlen(i) - 1; m++)        //冒泡排序
            for (n = 0; n < strlen(i) - 1 - m; n++)
            {
                if (cmp(strs[n], strs[n + 1]))      //字符串比较
                {
                    swap(strs[m], strs[m + 1]);       //字符串交换
                    break;                            //跳出第一层循环
                }
            }
    }

    for (i = 0; i < n; i++)
        printf("%s\n", strs[i]);          //依次打印出每个子串

    system("pause");
    return 0;
}

int cmp(char *str1, char *str2)
{
    int i;

    for (i = 0; i < strlen(str1) || i < strlen(str2); i++)
    {
        if (str1[i] < str2[i])
            return 1;
        else if (str1[i] > str2[i])
            return 0;
    }
}

void swap(char *element1, char *element2)
{
    char tmp[21];

    tmp[21] = element1;
    element1 = element2;
    element2 = tmp[21];
}

你的程序中并没有用到函数cmp,整个逻辑对不对了

首先,你的swap函数是有问题的,这里char* 和char[21]是有区别的, 不能直接赋值,数组赋值要用循环...
其次在输入时字符串末尾应该有\0

交换字符串代码的函数大致应该为

 void swap(char *element1, char *element2)
{
    char tmp[21];

    strcpy(tmp, element1 );
    strcpy(element1, element2 );
    strcpy(element2, tmp );
}