2013-05-08 58 views
0

我必须使用Bubble Sort技术按字典顺序排序字符串,而不使用任何库函数。我写了下面的代码在排序字符串时工作正常。

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

我在这里做错了什么?C:字符串数组 - 只能输入n-1个字符串,输入大小为n

#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); 
} 
+0

我不明白... 1)为什么你只输入n-1字符串?你没有说出什么问题。 2)为什么从0到n运行循环是“不合逻辑的”? – 2013-05-08 15:33:18

+0

注意:C标准说''malloc()'在''(不是'')中声明;它也不会谈论任何名为''的头文件。 – pmg 2013-05-08 15:34:36

+0

@KScottPiel为了回答你的第一个问题,我们以这个例子为例,如果我给“输入字符串数”4,那么我实际上只能输入3个字符串。 要回答你的第二个问题,如果我们从0开始数组索引,我们通常会达到n-1。所以如果我们遍历从0到n的数组,我们实际上遍历了一个额外的元素,这根据我的知识是不合逻辑的。 – titan7585 2013-05-08 15:39:56

回答

3

问题是您使用scanf()。当您执行scanf("%d", &n)时,scanf()函数将读取输入直到找到一个整数,并将该值存入n。但是,当您输入该整数时,您不仅输入'4',而且输入'4'并按Enter键。换行符仍然在输入缓冲区中。另一方面,gets()函数读取的输入高达,包括第一个换行符,并且换行符被丢弃。所以,当你读取输入字符串时,获取gets()的读数将读取换行符,并立即返回。然后,你进入由第二呼叫gets()阅读第一串...

顺便说一句,gets()功能应该永远,永远,在任何情况下,曾经被用于实际的程序,因为它不不允许你限制输入。最好是使用fgets()fgets(str[i], BUFFERSIZE-1, stdin)

+0

目前我似乎无法找到参考,但我的回忆是C专家建议不要使用'scanf()'。建议的替代方法是使用'fgets()'读取一行输入,然后在其上使用'sscanf()'。 – 2013-05-08 15:57:50

+0

由于我在输入每个字符串后按下Enter,fgets()将在每个字符串输入后采用所有换行符。说实话,我对sscanf()语法并不熟悉。 – titan7585 2013-05-08 16:18:14

+0

是的,'fgets()'复制换行符,不像'gets()'丢弃它。在每个字符串的末尾找到'\ n'并在其上写入0应该相当简单。 (其他问题:如果输入行太长,缓冲区将不会以空终止) – 2013-05-08 16:30:56

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

+0

是的,通过使用'scanf()'中的newline,然后检查'fgets()'中的换行符来设法获得解决方案。 – titan7585 2013-05-08 16:40:07

0

在必须输入字符串的行上尝试此操作。相反的:

gets(str[i]); 

类型:

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