我想在5个不同的行中输入一些字符串作为输入。一行可以包含多少单词没有限制。但我想要5行。我怎么能这样做?请帮助我。
示例:程序将如下所示
How many Line?
5
Enter 5 line:
hi i am john
i am new to c programming.
in have problem in string.
i can not take input
pleas help me.thanks a lot.
这是我的代码:
#include<stdio.h>
int main()
{
int line,i;
char *string;
printf("How many line?\n");
scanf("%d",&line);
for(i=0;i<line;i++)
{
gets(string);
}
printf("You entered:\n");
for(i=0;i<line;i++)
{
puts(string);
}
return 0;
}
在我的代码中它只是取(n-1)行。如果我给第4行它需要3行并且只打印最后一行4次。如何解决这个问题?
答案 0 :(得分:3)
代码中的错误是您为字符串分配了内存以存储用户输入。
此处代码char *string
是一个指针,指向用户输入中最后输入的字符串。因此,您将最后一个字符串作为输出,而不是获取所有字符串。
更改您的代码如下:
#include<stdio.h>
int main()
{
int line,i;
char string[50][80];
printf("How many line?\n");
scanf("%d",&line);
for(i=0;i<line;i++)
{
scanf("%s", string[i]);
}
printf("You entered:\n");
for(i=0;i<line;i++)
{
puts(string[i]);
}
return 0;
}
在此代码中,可以读取设置为rows
的最大行数(50
)和每行的最大宽度设置为80
。
如果您不确定要读取的最大行数或每行的宽度,则应为使用malloc
动态读取的每一行分配内存,并在返回之前将其释放使用free
。
同时避免对reasons
使用gets()
答案 1 :(得分:1)
不是静态指定2D数组,而是通过指定指针数组然后为添加到数组的每个字符串分配内存来提供更好的服务。虽然首选fgets
或getline
,但使用scanf
分配内存没有任何问题。 (注意:当前版本的scanf
在转换说明符之前使用m
进行分配,Windows和早期版本使用a
用于此目的)。使用scanf
进行分配时,scanf
需要类型为char **
的指针参数来保存已分配的字符串。分配内存时,无论如何,你负责释放内存,而不再需要内存。考虑到这一点,您的代码可以写成如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXD 64
int main() {
char *string[MAXD];
int line = 0;
int i = 0;
printf ("\nHome many lines: ");
scanf ("%d%*c", &line);
if (line > MAXD) { /* validate line <= MAXD pointers */
fprintf (stderr, "warning: request exceeds %d limit.\n", MAXD);
line = MAXD;
}
/* scanf will allocate if given 'm' ('a' on Win & earlier versions)
as part of the specification before the conversion specifier */
for (i = 0; i < line; i++) {
printf ("\n input: ");
scanf ("%m[^\n]%*c", &string[i]);
}
printf ("\nYou entered:\n\n");
for (i = 0; i < line; i++)
printf (" string[%d] : %s\n", i, string[i]);
printf ("\n");
/* free the memory allocated by scanf */
for (i = 0; i < line; i++)
free (string[i]);
return 0;
}
使用/输出强>
$ ./bin/scanf_string_dyn
Home many lines: 4
input: this is line 1
input: this is line 2
input: this is line 3
input: this is line 4
You entered:
string[0] : this is line 1
string[1] : this is line 2
string[2] : this is line 3
string[3] : this is line 4
您可以通过调整MAXD
定义来调整指针数。 (您也可以根据需要动态分配和重新分配它们,但这超出了您的问题的范围)