如果我想在一个二维数组中输入一个输入,每个字符串在一行中,而另一个输入在另一行中(即按Enter键时更改行)。我怎么能在C中做到这一点.C似乎没有方便的“字符串”处理。我显然是在不使用getchar()的情况下这样做。
答案 0 :(得分:3)
下面提到了3种方式。
如果您知道字符串的最大数量和最大字符数,则可以使用以下方式声明2D字符数组。
char strs[MAX_NO_OF_STRS][MAX_NO_CHARS] = {0};
for (i = 0; i < MAX_NO_OF_STRS; i++)
{
scanf("%s", strs[i]);
}
如果您知道最大字符串数,并且您不想通过为所有字符串分配MAX_NO_CHARS
的内存来浪费内存。然后去寻找一些char指针。
char temp[MAX_NO_CHARS] = {0};
char *strs[MAX_NO_OF_STRS] = NULL;
for (i = 0; i < MAX_NO_OF_STRS; i++)
{
scanf("%s", temp);
strs[i] = strdup(temp);
}
如果您知道运行时期间的最大字符串数,则可以声明char
的双指针。从用户获取字符串n
的数量,然后动态分配内存。
char temp[MAX_NO_CHARS] = {0};
char **strs = NULL;
int n = 0;
scanf("%d", &n);
strs = malloc(sizeof(char*) * n);
for (i = 0; i < n; i++)
{
scanf("%s", temp);
strs[i] = strdup(temp);
}
答案 1 :(得分:3)
#include<stdio.h>
main()
{
char student_name[5][25];
int i;
for(i=0;i<5;i++)
{
printf("\nEnter a string %d: ",i+1);
scanf(" %[^\n]",student_name[i]);
}
}
你可以使用2d数组读取字符串而不使用getchar()通过在scanf中放置空格(“%[^ \ n]”) ;在%[^ \ n]之前!
答案 2 :(得分:0)
使用malloc
并使用固定大小的缓冲区填充指针数组的替代方法是分配2d数组(在静态存储中或堆栈上)并填充它。 KingsIndian修改后的代码示例将如下所示:
#include <stdio.h>
int main()
{
char str[2][256] = {{0}};
int i = 0;
for(i=0;i<2;i++)
{
scanf("%255s", &str[i][0]);
}
return 0;
}
如果您希望获得的所有字符串都不超过某个大小,那么这种方法将使您无需处理释放内存的问题。但它的灵活性较低,这意味着您无法将单个缓冲区的大小与其包含的字符串相匹配。
修改强>
添加注释中的信息,以读取仅由换行符而不是任何空格终止的字符串:
scanf("%255[^\n]", str[i]);