0

我编写了一个程序,它可以对您输入的 5 个字符串从小到大进行排序。但是,它无法工作。我已经工作了将近一个小时,但我找不到问题所在。这是代码。

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

    main() {
    char *sz[5], *temp;
    int i, j;
    for(i = 0; i < 5; i++) {
        gets(sz[i]);
        fflush(stdin);
    }
    for(i = 0; i < 5; i++) {
        for(j = i+1; j < 5; j++) {
            if(strcmp(sz[i], sz[j]) > 0) {
                temp = sz[i];
                sz[i] = sz[j];
                sz[j] = temp;
            }
        }
        puts(sz[i]);
        puts("");
        }
    }
4

3 回答 3

4

第一个大问题是您正在使用一个本不应该存在的例程,并且使用不当:

char *sz[5], *temp;
int i, j;
for(i = 0; i < 5; i++) {
    gets(sz[i]);

您没有分配任何存储gets()来存储,所以它只是在不相关的内存上涂鸦。(这通常会导致安全问题。)

您应该特别注意手册页中的BUGS部分:

BUGS
   Never use gets().  Because it is impossible to tell without
   knowing the data in advance how many characters gets() will
   read, and because gets() will continue to store characters
   past the end of the buffer, it is extremely dangerous to use.
   It has been used to break computer security.  Use fgets()
   instead.

现在忘掉学习gets(3),做一个更快乐的程序员。

用于malloc()为这些字符数组分配一些内存。

Ignacio 直截了当地解决了另一个问题——您在排序完成之前打印。排序后添加另一个循环打印。(更好的是,将输入、排序和输出放在三个单独的函数中。也许你还没有,但最好早点而不是晚点这样做,因为它使测试你的程序变得更容易拥有打印功能您可以用于调试。)

于 2012-06-12T07:39:40.443 回答
3
char *sz[5], *temp;
int i, j;
for(i = 0; i < 5; i++) {
    gets(sz[i]); /* Tries to write data to random location. */
    fflush(stdin);
}

至少3个问题:

  • 您正在写入未初始化的指针。您需要sz[i]在使用它之前进行初始化(可能使用malloc
  • fflush(stdin)是未定义的行为,放弃它
  • gets不安全并已从标准中删除,也将其删除并fgets改用
于 2012-06-12T07:37:45.113 回答
2

您将未初始化的指针传递给gets,将数据存储在随机位置。这是未定义的行为。您应该为数据分配内存,并使用fgets限制来读取字符串。

char *sz[5], *temp;
int i, j;
char buf[100];
for(i = 0; i < 5; i++) {
    fgets (buf , 100 , stdin);
    sz[i] = strdup(buf);
}
... sort your strings...
// Free the strings before exiting the program
for (i = 0 ; i < 5 ; i++) free(sz[i]);
于 2012-06-12T07:38:06.933 回答