如何在一行中读取 C 中的多个字符串,每个字符串都包含空格?
How to read multiple strings in C one in a line, each containing spaces?
我分配了一个二维字符数组,在读取之间没有空格的字符串时,代码运行良好。当我用空格阅读它们时,我遇到了一个错误。如何读取所有 N 个字符串,每个字符串都在一行中,每个字符串都包含空格。
示例输入:
Enter total number of Strings : 3
Enter all the 3 Strings :
John Doe
Jane Doe
Trad Braversy
我的代码:
// Code to enter the total number of Strings :
int N;
printf("\n\tEnter the total number of Strings : ");
scanf("%d", &N);
// Code for allocating initial memory to them :
char** strings = (char**)malloc(N * sizeof(char*));
for (int i = 0; i < N; ++i) {
strings[i] = (char*)malloc(1024 * sizeof(char));
}
// Code for entering all the N strings :
printf("\n\tEnter all the %d Strings :\n", N);
for (int i = 0; i < N; ++i) {
gets(strings[i]);
}
// Code to reallocate the memory according to the entered length :
for (int i = 0; i < N; ++i) {
strings[i] = (char*)realloc(strings[i], strlen(strings[i]) + 1);
}
几点观察:
阅读整行文本,然后从中解析出整数比对单个整数执行 scanf()
更安全。这是因为后者在流中留下了换行符,这会混淆后面的读取。
为此使用 malloc()
进行动态内存分配没有实际意义,您可以使用 VLA:
char strings[N][1024];
请注意,在 C 语言中,对运行时变量使用仅大写符号在风格上很奇怪。
那么,多更好用fgets()
,更安全也更好:
for (int i = 0; i < N; ++i)
{
if (fgets(strings[i], sizeof strings[i], stdin) == NULL)
{
fprintf(stderr, "**Read error on string %d\n", i);
exit(1);
}
}
和往常一样,准备好 I/O 可能会失败,并尝试处理它。
我分配了一个二维字符数组,在读取之间没有空格的字符串时,代码运行良好。当我用空格阅读它们时,我遇到了一个错误。如何读取所有 N 个字符串,每个字符串都在一行中,每个字符串都包含空格。
示例输入:
Enter total number of Strings : 3
Enter all the 3 Strings :
John Doe
Jane Doe
Trad Braversy
我的代码:
// Code to enter the total number of Strings :
int N;
printf("\n\tEnter the total number of Strings : ");
scanf("%d", &N);
// Code for allocating initial memory to them :
char** strings = (char**)malloc(N * sizeof(char*));
for (int i = 0; i < N; ++i) {
strings[i] = (char*)malloc(1024 * sizeof(char));
}
// Code for entering all the N strings :
printf("\n\tEnter all the %d Strings :\n", N);
for (int i = 0; i < N; ++i) {
gets(strings[i]);
}
// Code to reallocate the memory according to the entered length :
for (int i = 0; i < N; ++i) {
strings[i] = (char*)realloc(strings[i], strlen(strings[i]) + 1);
}
几点观察:
阅读整行文本,然后从中解析出整数比对单个整数执行 scanf()
更安全。这是因为后者在流中留下了换行符,这会混淆后面的读取。
为此使用 malloc()
进行动态内存分配没有实际意义,您可以使用 VLA:
char strings[N][1024];
请注意,在 C 语言中,对运行时变量使用仅大写符号在风格上很奇怪。
那么,多更好用fgets()
,更安全也更好:
for (int i = 0; i < N; ++i)
{
if (fgets(strings[i], sizeof strings[i], stdin) == NULL)
{
fprintf(stderr, "**Read error on string %d\n", i);
exit(1);
}
}
和往常一样,准备好 I/O 可能会失败,并尝试处理它。