C 根据字符串的长度在静态数组中排序|错误的分配/访问|
我想创建一个字符串数组,并根据它们的长度(最小->最大)对它们进行排序,但程序在所有输入后崩溃。C 根据字符串的长度在静态数组中排序|错误的分配/访问|,c,arrays,sorting,memory-management,c-strings,C,Arrays,Sorting,Memory Management,C Strings,我想创建一个字符串数组,并根据它们的长度(最小->最大)对它们进行排序,但程序在所有输入后崩溃。 它还绕过元素0(在输入过程中直接从元素1开始) #包括 #包括 main() { inti,j,N; printf(“\n字母数字的输入量:”); scanf(“%d”和“&N”); { int-min; char*swap=(char*)malloc(sizeof(char)*150); 字符*A[N],**温度; 对于(i=0;i此错误: for(i=0;i<N;i++) *(A
它还绕过元素0(在输入过程中直接从元素1开始)
#包括
#包括
main()
{
inti,j,N;
printf(“\n字母数字的输入量:”);
scanf(“%d”和“&N”);
{
int-min;
char*swap=(char*)malloc(sizeof(char)*150);
字符*A[N],**温度;
对于(i=0;i此错误:
for(i=0;i<N;i++)
*(A+i)=malloc(sizeof(char)*N);//Error Here
第二个问题是因为您试图传递char**而不是char*
修正:
另外,scanf(“%d”和“&N”)后面的括号限制了变量min和swap的范围,因此以后应该根本不可见。首先,元素0会发生什么:输入scanf(“%d”)读取的元素数之后
,您可以按Enter键,以便输入到达程序。但是scanf
调用只读取数字,而不读取换行符。因此,对fgets
的第一次调用将获取该行剩余的内容-空行
有关解决此问题的几种方法,请参阅。最可靠的方法是调用fgets
读取一行(预计将调用该号码),然后调用sscanf
解析内存中字符串中的号码
第二个问题是在调用fgets(temp+i,150,stdin)
中。一个好的编译器会产生如下警告:
a.c:17:9: warning: passing argument 1 of ‘fgets’ from incompatible pointer type [enabled by default]
您正在传递指向char
(包含字符串缓冲区地址的位置地址)的指针,但fgets
需要指向char
(字符串缓冲区地址)的指针。因为temp+i
是指向数组a
(指针数组)中的项的指针,您需要传递给fgets
的是该指针指向的值:*(temp+i)
,这是更常见的temp[i]
。给定如何处理变量temp
,只需将其放下并使用A
fgets(A[i], 150, stdin);
之后,您的排序路由并不总是返回正确的结果,但这是另一回事。您能告诉我为什么排序算法总是不起作用吗?@niCk IIRC我在一些样本输入上运行了它,它打印的项目比我输入的少。我没有保存我使用的输入。确切地说,如果输入不是2,4…等,对吗?
fgets(*(temp+i),150,stdin);//And Here
a.c:17:9: warning: passing argument 1 of ‘fgets’ from incompatible pointer type [enabled by default]
fgets(A[i], 150, stdin);