将字符串存储在另一个字符串的指针数组中

Storing strings in an array of pointers from another string

我是自学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) = '[=10=]';
   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++) = '[=10=]';
         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 后崩溃。

问题是您交换了 jk 索引。

*(*(str + k++) + j) = *(str1 + i);
*(*(str + k) + j++) = '[=10=]';

相当于:

str[k++][j] = str1[i];
str[k][j++] = '[=11=]';

这不是你想做的。你想要的是:

str[j][k++] = str1[i]; /* *(*(str + j) + k++) = *(str1 + i); */
str[j++][k] = '[=12=]';    /* *(*(str + j++) + k) = '[=12=]';        */

其他评论(部分来自对你提问的评论):

  1. void main() 应该是 int main(void)
  2. 使用 -Wall -Wextra 编译,特别是如果您正在学习
  3. 你的第一个 whilefor:

    for (i = 0; (c = getchar()) != EOF) && i < temp-1; i++)
        *(str + i) = c;
    

    for (i = 0; (str[i] = getchar()) != EOF) && i < temp-1; i++)
        ;
    
  4. 你的第二个while也是一个forfor (i = 0, j = 0, k = 0; i < temp && j < LINES; i++)

  5. 你会错过最后一行,因为 j + 1 == LINES
  6. 除非你正在练习指针,否则不要这样做*(*(str + k++) + j);即使你正在练习指针,也不要这样做,因为你可以练习使用指针访问,而不是使用指针表示法的索引。
  7. 阅读 string.h 文档,您会发现许多功能可以让您的生活更轻松:fgetsstrchrstrdup