2

如果我想在一个二维数组中输入一个输入,每个字符串在一行中,下一个在另一行中(即在按 Enter 时更改行)。我怎么能在 C 中做到这一点。C 似乎没有方便的“字符串”处理。我显然是指不使用 getchar() 这样做。

4

3 回答 3

5

有下面提到的3种方法。

如果您知道最大字符串数和最大字符数,则可以使用以下方式声明二维字符数组。

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);
}
于 2013-01-26T10:54:28.043 回答
4
#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]);
    }

}

您可以通过在 scanf(" %[^\n]") 中放置空间来使用二维数组读取字符串,而无需使用 getchar();在 %[^\n]!

于 2013-01-26T12:17:03.563 回答
0

使用malloc和填充具有固定大小的缓冲区的指针数组的另一种方法是分配一个二维数组(在静态存储中或堆栈上)并填充它。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]);
于 2013-01-26T10:57:17.837 回答