我的计划有什么问题?

时间:2012-06-12 07:33:08

标签: c

我编写了一个程序,可以排序从小到大输入的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("");
        }
    }

3 个答案:

答案 0 :(得分:4)

第一个大问题是你正在使用一个本来不应该存在的例程,并且使用它不正确:

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

您没有为gets()分配任何存储空间,因此它只是在不相关的内存上涂鸦。 (这通常导致security problems。)

您应该特别注意您的联机帮助页中的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 hit another problem squarely on the head - 您在排序完成之前打印。排序后添加另一个要打印的循环。 (更好的是,将输入,排序和输出分成三个独立的功能。也许你还没有,但是很快就可以做到这一点,因为它使测试你的程序更容易具有打印功能你可以用来调试。)

答案 1 :(得分: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代替

答案 2 :(得分: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]);