我搜索了一下,找不到任何与没有使用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]中的字符之后,并且然后一起改变字符串;这是错的。我会更改我的代码来纠正这个问题,但如果我正在以正确的方式比较字符,我仍然不知道。
答案 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];
但由于您没有使用标准库函数,因此需要手动复制字符串。