如何比较两个字符串中的字符按字母顺序排序? (没有c字符串库函数)

时间:2015-02-10 01:49:11

标签: c arrays string comparison character

我搜索了一下,找不到任何与没有使用strcmp等字符串库函数的字符进行比较,所以希望这个问题不重复。我来自Java,对C语言有点新意。我试图比较两个字符串(保存在同一个数组中)按字母顺序排序,但尝试没有C字符串库函数,并且似乎无法解决这个问题。有人能指出我正确的方向吗?

for (i = 0; i < TotalStrings; i++) { /* TotalStrings is the number of strings in the array */
if (length[i] < length[i+1]) { /* compares length of both strings, saved in a different array */
 for (j = 0; j < length[i]; j++) {
   if (Strings[i][j] > Strings[i+1][j]) {
       char temp = Strings[i];
       Strings[i] = Strings[i+1];
       Strings[i+1] = temp;
       j = length[i];
   }
  }
}
if (length[i] > length[i+1]) { /* compares length of both strings, saved in a different array */
 for (j = 0; j < length[i+1]; j++) {
   if (Strings[i][j] > Strings[i+1][j]) {
       char temp = Strings[i];
       Strings[i] = Strings[i+1];
       Strings[i+1] = temp;
       j = length[i];
       }
      }
     }

行if(Strings [i] [j]&gt; Strings [i + 1] [j])是我被卡住的地方。正如我所教导的那样,2D数组中的第一个括号保持字符串,第二个括号指向字符?我不确定如何准确比较这些字符串的字符。非常确定试图像我一样(就像我想的那样)是关闭的。

另外,不确定这是否与我上面的代码有关(由于它未完成或因为temp是char类型而且Strings是Char类型的2D数组;但是我收到指向等号的错误在下面的声明中:

error: incompatible types when assigning to type 'char[1000]' from type 'char'
            Strings[i+1] = temp;

编辑:现在查看我的代码,我可以看到一个巨大的缺陷,它会一直运行,直到string [x]中相同索引处的字符出现在字符串[x + 1]中的字符之后,并且然后一起改变字符串;这是错的。我会更改我的代码来纠正这个问题,但如果我正在以正确的方式比较字符,我仍然不知道。

2 个答案:

答案 0 :(得分:1)

由于@Nunzio Tocci已在您的代码中显示此问题。

代码中的问题是, 将指向char的指针赋给char变量,反之亦然。

您可以通过将代码分解为函数来改进代码,例如用于比较字符串和另一个用于对其进行排序,因为您也不能使用strcpy(因为您说没有标准库调用),您可以编写一个字符串复制函数,并实现代码。

下面是一个例子,你可以从这里查看并开始自己的。

#include <stdio.h>
#include <stdlib.h>

// Compare two strings, returns -1, 0 ,1
int string_compare(const char* s1, const char* s2) {
    // perfrom null dereferencing error checking
    while( (*s1==*s2) && *s1 )
        s1++,s2++;
    return *s1 < *s2 ? -1 : *s1 > *s2;
}

// Copy s2 into s1
int string_copy(char *s1, const char* s2){
    // perfrom null dereferencing error checking
    while( (*s1++ = *s2++) )
        ;
    return 0;
}

// Sort the array of string
char *const *const string_sort(char *const *const str, const int     totalString,const int strMaxLen) {

    char *temp = malloc(strMaxLen);  // Using temp for swapping
    int i,j;

    for (i = 0; i < totalString; i++) {
        for (j = 0; j < totalString - 1; j++) {
            if (string_compare(str[j], str[j + 1]) > 0) {
                string_copy(temp,str[j]);
                string_copy(str[j],str[j + 1]);
                string_copy(str[j + 1],temp);
            }
        }
    }
    free(temp);
    return str;
}

int main() {
    /* No of strings/ can be known at runtime also
       since we are not using array */
    const int totalString = 10; 
    const int strLen = 1000;    // string length 

    // Pointer to store address of an the array of string.
    char **str = NULL;  
    int i;

    /* Allocate memory for storing the 
       address of "totalString" no of stirngs */
    str = malloc(totalString*sizeof(char*));

    /* allocate memory to store a string 
       witb 'strLen' length */
    for(i = 0; i < totalString; ++i)
        str[i] = malloc(strLen);

    /* Read from the user or
       any external source ( ex: file) */
    for(i = 0; i < totalString; ++i)
        scanf("%s",str[i]);

    /* sort the strings */
    string_sort(str,totalString,strLen);

    /* print then */
    for( i = 0; i < totalString; ++i )
        printf("%s\n",str[i]);

    for( i = 0; i < totalString; ++i )
        free(str[i]);
    free(str);
    return 0;
}

答案 1 :(得分:0)

更新(见下文)
关于错误:
看起来像是 char temp = Strings[i];
应该是:
<击> char *temp = Strings[i];
我不知道为什么编译器在用指针分配字符变量时没有出错,但这就是问题所在。 我建议在C中阅读pointers,特别是如果你来自Java。

关于你原来的问题:
看起来你正在以正确的方式比较它们 另外,是的,因为你已经被教过,2D数组中的第一个括号保持字符串,第二个括号指向字符。

更新:
正如乔纳森所说,温度实际应该是:
char temp[1000];
但由于您没有使用标准库函数,因此需要手动复制字符串。