C 如何在不同的行中进行字符串输入?

C 如何在不同的行中进行字符串输入?,c,string,input,C,String,Input,我想在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>

我想在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;
 }
#包括
int main()
{
int行,i;
字符*字符串;
printf(“多少行?\n”);
scanf(“%d”行和“&line”);

对于(i=0;i而言,代码中的错误在于为字符串分配了内存以存储用户输入

这里的code
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;
}
#包括
int main()
{   
int行,i;
字符串[50][80];
printf(“多少行?\n”);
scanf(“%d”行和“&line”);

对于(i=0;i而言,代码中的错误在于为字符串分配了内存以存储用户输入

这里的code
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;
}
#包括
int main()
{   
int行,i;
字符串[50][80];
printf(“多少行?\n”);
scanf(“%d”行和“&line”);

对于(i=0;i而言,与其静态地指定2D数组,不如指定一个指针数组,然后为添加到数组中的每个字符串分配内存。虽然首选
fgets
getline
,但使用
scanf
分配内存没有错。(注意:当前版本的
scanf
在分配转换说明符之前使用
m
,windows和早期版本使用
a
)。当使用
scanf
进行分配时,
scanf
需要一个
char**
类型的指针参数来保存分配的字符串。当分配内存时,无论如何,当不再需要时,您负责释放内存。考虑到这一点,您的代码可以d应写如下:

#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;
}

您可以通过调整
MAXD
define来调整指针的数量。(您也可以根据需要动态分配和重新分配指针,但这超出了问题的范围)

与其静态地指定2D数组,不如指定指针数组,然后为添加到数组中的每个字符串分配内存。虽然首选
fgets
getline
,但使用
scanf
分配内存没有错。(注意:当前版本的
scanf
在分配转换说明符之前使用
m
,windows和早期版本使用
a
)。当使用
scanf
进行分配时,
scanf
需要一个
char**
类型的指针参数来保存分配的字符串。当分配内存时,无论如何,当不再需要时,您负责释放内存。考虑到这一点,您的代码可以d应写如下:

#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;
}

您可以通过调整
MAXD
define来调整指针的数量。(您也可以根据需要动态分配和重新分配指针,但这超出了问题的范围)

抱歉,Stackoverflow不是为您工作的。请编写您自己的代码。如果遇到特定问题,请返回,发布代码并提出特定问题。请重试……我这样做了,但它不起作用。这是我的代码请更新您的问题(单击问题正文底部的“编辑”)。不要将其添加到注释中,因为它无法格式化,可能会被其他人遗漏。请更详细地描述您的问题(不仅仅是“它不工作”)。例如示例输入、预期输出和实际输出。或者您的程序显示的任何错误行为。请参阅。不要使用它。一个问题是
scanf(“%d”,&line)
在输入缓冲区中留下一个换行符。第一个
get()
-应该是
fgets()
-读取换行符。另一个问题是您没有初始化
字符串
指向任何存储;您应该使用
字符字符串[4096];
或类似内容。抱歉,Stackoverflow不是为您工作的。请编写您自己的代码。如果遇到特定问题,请返回,发布代码并提出特定问题。请重试……我这样做了,但不起作用。这是我的代码请更新您的问题(单击问题正文底部的“编辑”)。不要将其添加到注释中,因为它无法格式化,可能会被其他人遗漏。请更详细地描述您的问题(不仅仅是“它不工作”)。例如示例输入、预期输出和实际输出。或者您的程序显示的任何错误行为。请参阅。不要使用它。一个问题是
scanf(“%d”,&line)
在输入缓冲区中留下一个换行符。第一个
get()
-应该是
fgets()
-读取换行符。另一个问题是您没有初始化
字符串
指向任何存储;您应该使用
字符字符串[4096]
或类似的东西。我将它的char*string改为char string[1000]。但它仍然使用(n-1)行并只打印最后一行。
string
应该是
2-D
数组。
char string[1000]
将只存储输入的一行,这是最后一行。使用
char string[x][y]并更改get()对scanf
scanf()不起作用,因为它会在第一次出现任何空白时停止。建议使用fgets()我将其更改为c