将字符串存储在另一个字符串的指针数组中
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 后崩溃。
问题是您交换了 j
和 k
索引。
*(*(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=]'; */
其他评论(部分来自对你提问的评论):
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
等
我是自学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 后崩溃。
问题是您交换了 j
和 k
索引。
*(*(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=]'; */
其他评论(部分来自对你提问的评论):
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
等