2012-06-12 79 views
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(""); 
     } 
    } 
+0

哪些输入触发问题?在给出这些输入时你会得到什么输出?你是否尝试过所有相同的长度,增加尺寸和减小尺寸? – sarnold

回答

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 - 在排序完成前打印。排序后添加另一个循环打印。 (更好的是,将输入,排序和输出分成三个单独的函数,也许你还没有这样做,但是这样做很快就可以做到这一点,因为它使测试你的程序变得更加容易,从而具有打印功能您可以用于调试。)

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个问题:

  • 你写了未初始化的指针。你需要(可能使用malloc
  • fflush(stdin)是不确定的行为在使用前初始化sz[i],砸
  • gets是不安全的,从标准已被删除,删除它以及和使用fgets代替
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]);