【问题标题】:C : Array of strings - Can input only n-1 strings for an input size of nC : 字符串数组 - 输入大小为 n 时只能输入 n-1 个字符串
【发布时间】:2013-05-02 21:55:56
【问题描述】:

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

但问题是,如果我给 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);
}

【问题讨论】:

  • 我不明白... 1)为什么只能输入n-1个字符串?你不说是什么问题。 2) 为什么将循环从 0 运行到 n 是“不合逻辑的”?
  • 注意:C 标准说函数malloc() 是在&lt;stdlib.h&gt; 中声明的(不是&lt;malloc.h&gt;);它也根本不谈论任何名为 &lt;malloc.h&gt; 的标题。
  • @KScottPiel 要回答你的第一个问题,让我们举这个例子,如果我给“输入字符串数”4,那么我实际上只能输入 3 个字符串。要回答您的第二个问题,如果我们从 0 开始数组索引,我们通常会上升到 n-1。因此,如果我们从 0 到 n 遍历数组,我们实际上是在遍历一个额外的元素,据我所知,这不符合逻辑。
  • 你不是从 0 到 n 遍历数组,而是从 0 到小于 n 的数组。
  • 啊,找到问题了。

标签: c arrays string multidimensional-array bubble-sort


【解决方案1】:

在你必须输入字符串的那一行试试这个。而不是:

gets(str[i]);

类型:

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

【讨论】:

    【解决方案2】:
    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 之前使用它

    【讨论】:

    • 是的,通过使用 scanf() 中的换行符,然后检查 fgets() 中的换行符,设法获得了解决方案。
    【解决方案3】:

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

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

    【讨论】:

    • 我目前似乎找不到参考,但我记得C专家建议不要使用scanf()。建议的替代方法是使用fgets() 读取一行输入,然后在其上使用sscanf()
    • fgets() 在每个字符串输入后使用所有换行符,因为我在输入每个字符串后按 Enter 键。说实话,我对 sscanf() 语法不太熟悉。
    • 是的,fgets() 复制换行符,不像 gets() 丢弃它。在每个字符串的末尾找到 '\n' 并在其上写一个 0 应该相当简单。 (其他问题:如果输入行太长,缓冲区将不会以空值结尾。)
    • 好的,通过使用 scanf() 中的换行符,然后检查每个 fgets() 条目中的换行符并将换行符替换为 null 来解决问题。这至少似乎是比从 0 遍历数组到 n 更好的解决方案。非常感谢。 .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多