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

时间:2015-06-21 05:28:50

标签: 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>
 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次。如何解决这个问题?

2 个答案:

答案 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数组,而是通过指定指针数组然后为添加到数组的每个字符串分配内存来提供更好的服务。虽然首选fgetsgetline,但使用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定义来调整指针数。 (您也可以根据需要动态分配和重新分配它们,但这超出了您的问题的范围)