#include <stdio.h>
#include <stdlib.h>
int cmpfunc(const void *a, const void *b) {
const char *ia = (const char*)a;
const char *ib = (const char*)b;
return *ia - *ib;
}
int is_permutation(char *s1, char *s2){
int i, n1, n2;
n1 = sizeof(s1)/sizeof(s1[0]);
n2 = sizeof(s2)/sizeof(s2[0]);
if(n1 != n2){
return 0;
}
qsort(s1, n1, sizeof(s1), cmpfunc);
qsort(s2, n2, sizeof(s2), cmpfunc);
for (i = 0; i < n1; i++)
if (s1[i] != s2[i])
return 0;
return 1;
}
int main(){
char s1[5] = "check";
char s2[5] = "check";
printf("%d", is_permutation(s1,s2));
return 0;
}
它只是在没有编译器错误的情况下崩溃。我已经检查过并且qsort崩溃了程序,其他一切似乎都正常工作。有什么帮助吗?
我使用&#34; gcc -g -ans--pedantic -Wall prog.c -o prog&#34;
编译答案 0 :(得分:3)
sizeof(s1)
&amp; c。 不是数组中元素数量的函数。这是因为s1
已将衰减指针类型。
strlen
可用于获取字符串的长度,但您需要编写
char s1[6] = "check";
或更好,
char s1[] = "check";
为NUL终结符留出空间。
答案 1 :(得分:0)
我已经检查过并且qsort崩溃了程序,其他一切似乎都正常工作。 ?不,在调试器中运行?尝试使用-g
选项进行编译并运行gdb
并执行bt
。
有问题的陈述是
n1 = sizeof(s1)/sizeof(s1[0]); /* it will results in 4/1 that is 4 */
n2 = sizeof(s2)/sizeof(s2[0]);
而是在s1
内旋转循环并查找长度,或使用strlen()
查找s1
和s2
的长度为
for(n1 = 0;s1[n1]!='\0'; n1++); /* dummy loop, at the end of loop, n1 will be length of s1 */
for(n2 = 0;s2[n2]!='\0'; n2++);
并且
qsort(s1, n1, sizeof(s1[0]), cmpfunc);
qsort(s2, n2, sizeof(s2[0]), cmpfunc);
以下是示例is_permutation()
函数
int is_permutation(char *s1, char *s2){
int i, n1, n2;
for(n1 = 0;s1[n1]!='\0'; n1++); /* dummy loop, at the end of loop, n1 will be length of s1 */
for(n2 = 0;s2[n2]!='\0'; n2++);
if(n1 != n2){
return 0;
}
qsort(s1, n1, sizeof(s1[0]), cmpfunc);
qsort(s2, n2, sizeof(s2[0]), cmpfunc);
for (i = 0; i < n1; i++)
if (s1[i] != s2[i])
return 0;
return 1;
}
最重要的是char s1[5]="check"
没有\0
字符的空间。因此,要么char s1[6]
或char s1[]= "check"