我正在尝试创建一个程序来检查字符串列表是否按字典顺序排列。如果它是有序的,程序应该返回1,如果不是0.为了测试程序我引入了字符串AA,BB和CC,显然应该是有序的。但是,程序返回0 ...
#include<stdio.h>
#include<string.h>
int lex_sorted(const char* array[]){
int k;
for(k=0;*array+k+1!=NULL;k++){
if(strcmp(*array+k,*array+k+1)<0){
return 0;
}
}
return 1;
}
int main(void){
int result;
const char* array[]={"AA","BB","CC",NULL};
result= lex_sorted(array);
printf("%d\n",result);
return 0;
答案 0 :(得分:0)
由于第一个字符串小于第二个字符串,因此该函数返回0,因为该语句
if(strcmp(*array+k,*array+i+1)<0){
return 0;
}
当k
和i
等于0时。
所以你所做的就是你得到的,
在函数中使用两个循环是没有意义的。该功能可以定义为本演示程序中显示的
#include <stdio.h>
#include <string.h>
int lex_sorted( const char* array[] )
{
if ( *array )
{
while ( *++array && strcmp( array[-1], array[0] ) <= 0 );
}
return *array == NULL;
}
int main(void)
{
const char * array[] = { "AA", "BB", "CC", NULL };
printf( "%d\n", lex_sorted( array ) );
return 0;
}
程序输出
1
因为数组是有序的。
答案 1 :(得分:0)
*arr+k
和*(arr+k)
,*arr+k+1
和*(arr+k+1)
是两种不同的表达方式。strcmp() > 0
,而不是strcmp() < 0
。i
应该在每次迭代之前初始化(内部循环)提示:
arr[k]
代替*(arr+k)