我正在自学C,遇到一个问题,需要根据行的长度对行进行排序。此部分将来自输入流的字符存储到数组中,并将每行放入指针数组中。然后尝试打印第一行。
#include <stdio.h>
#include <string.h>
#define LINES 5
void main()
{
char c;
char* str1 = (char*)malloc(30);
char* str[LINES];
int i = 0,temp;
while ((c = getchar()) != EOF) //storing all characters from input stream into an array
*(str1 + i++) = c;
*(str1 + i) = '\0';
temp = i;//total number of characters
i = 0;
int j = 0, k = 0;
str[j] = (char*)malloc(30);
while (i < temp)//storing each line in separate pointers of the array of pointers
{
if (j + 1 == LINES)
break;
if (*(str1 + i) == '\n')
{
*(*(str + k) + j++) = '\0';
str[j] = (char*) malloc(30);
k = 0;
}
else
*(*(str + k++) + j) = *(str1 + i);
i++;
}
printf("%s\n", str[0]);//printing the first line
}
这是我的输出屏幕:
iiii
iii
ii
i
i
^Z
Press any key to continue . . .
在输入屏幕上输入并输入EOF后,程序崩溃。 为什么它不起作用?
在EOF之后它崩溃了。
答案 0 :(得分:1)
问题是您交换了j
和k
索引。
*(*(str + k++) + j) = *(str1 + i);
*(*(str + k) + j++) = '\0';
等效于:
str[k++][j] = str1[i];
str[k][j++] = '\0';
,这不是您想要做的。您想要的是:
str[j][k++] = str1[i]; /* *(*(str + j) + k++) = *(str1 + i); */
str[j++][k] = '\0'; /* *(*(str + j++) + k) = '\0'; */
其他评论(其中一些来自您对问题的评论):
void main()
应该是int main(void)
-Wall -Wextra
进行编译,特别是如果您正在学习您的第一个while
是for
:
for (i = 0; (c = getchar()) != EOF) && i < temp-1; i++)
*(str + i) = c;
或
for (i = 0; (str[i] = getchar()) != EOF) && i < temp-1; i++)
;
您的第二个while
也是for
:for (i = 0, j = 0, k = 0; i < temp && j < LINES; i++)
j + 1 == LINES
,您将错过最后一行。*(*(str + k++) + j)
执行此操作;即使您正在练习指针,也不要这样做,因为可以练习使用指针而不是使用指针符号的索引进行访问。string.h
文档,您会发现许多简化生活的功能:fgets
,strchr
,strdup
等。