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”)后面的括号限制了变量minswap的范围,因此以后应该根本不可见。

首先,元素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);