0

我必须使用冒泡排序技术按字典顺序对字符串进行排序,而不使用任何库函数。我编写了以下代码,在对字符串进行排序时效果很好。

但问题是,如果我给n作为输入(比如 n = 4),我只能输入n-1 个字符串(只有 3 个字符串)。这个问题可以通过从 0 到 n 运行 for 循环来解决,但这不是一个合乎逻辑的解决方案。

我在这里做错了什么?

#include <stdio.h>
#include <string.h>
#include <malloc.h>
void swap(int indx[], int j)
{
    int temp;
    temp = indx[j];
    indx[j] = indx[j+1];
    indx[j+1] = temp;
}
void sort(char **str, int indx[], int n)
{
    int i, j, k;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n-i-1; j++)
        {
            k = 0;
            while(str[j][k] != '\0')
            {
                if((str[indx[j]][k]) > (str[indx[j+1]][k]))
                {
                    swap(indx, j);
                    break;
                }
                else if((str[indx[j]][k]) < (str[indx[j+1]][k]))
                    break;
                else
                    k++;
            }
        }
    }
}
void display(char **str, int indx[], int n)
{
    int i;
    printf("Sorted strings : ");
    for(i=0; i<n; i++)
        printf("%s\n", str[indx[i]]);
}
int main(void)
{
    char **str;
    int n, i, j, *indx;
    printf("Enter no. of strings : ");
    scanf("%d", &n);
    str = (char **) malloc (n * (sizeof(char *)));
    indx = (int *) malloc (n * sizeof(int));
    for(i=0; i<n; i++)
        str[i] = (char *)malloc(10 * sizeof(char));
    printf("Enter the strings : ");
    for(i=0; i<n; i++)
    {
        gets(str[i]);
        indx[i] = i;
    }
    sort(str, indx, n);
    display(str, indx, n);
}
4

3 回答 3

3

问题是您使用scanf(). 当您这样做时scanf("%d", &n),该scanf()函数会读取输入,直到找到一个整数,然后将值放入n. 但是,当您输入该整数时,您不仅输入了“4”,还输入了“4”并按下了 Enter。并且换行符仍在输入缓冲区中。gets()另一方面,该函数读取输入直到并包括第一个换行符,并且换行符被丢弃。因此,当您读取输入字符串时,gets 调用gets()读取换行符,并立即返回。然后,您输入的第一个字符串被第二次调用读取gets()...

顺便说一句,gets()在任何情况下,该函数都不应该用于实际程序,因为它不允许您限制输入。更好的是使用fgets(). fgets(str[i], BUFFERSIZE-1, stdin).

于 2013-05-08T15:51:03.240 回答
0

在你必须输入字符串的那一行试试这个。代替:

gets(str[i]);

类型:

scanf("%s",str[i]);
于 2014-01-18T10:36:37.540 回答
0
int main(void)
{
char **str;
int n=4, i, j, *indx;
printf("Enter no. of strings : ");
//scanf("%d", &n);
str = (char **) malloc (n * (sizeof(char *)));
indx = (int *) malloc (n * sizeof(int));
for(i=0; i<n; i++)
    str[i] = (char *)malloc(10 * sizeof(char));
printf("Enter the strings : ");
for(i=0; i<n; i++)
{
    gets(str[i]);
    indx[i] = i;
}
sort(str, indx, n);
display(str, indx, n);
}

//如果我注释掉scanf并给int值它工作正常//所以问题是在scanf之后使用fgets,因为scanf在缓冲区中留下换行符//所以在使用fgets之前使用它

于 2013-05-08T16:00:15.523 回答