【问题标题】:How to take string input in different lines?如何在不同的行中输入字符串?
【发布时间】:2015-06-21 05:28:50
【问题描述】:

我想在 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 次。我该如何解决这个问题?

【问题讨论】:

  • 抱歉,Stackoverflow 不是来为您工作的。请编写您自己的代码。如果您遇到特定问题,请返回,发布代码并提出特定问题。
  • 对不起......我做到了,但它不起作用。这是我的代码
  • 请更新您的问题(点击问题正文底部的“编辑”)。不要将其添加到 cmets 中,因为它无法格式化并且可能会被其他人遗漏。请更详细地描述您的问题(不仅仅是“它不工作”)。例如样本输入、预期输出和实际输出。或者您的程序表现出的任何错误行为。
  • Why gets() is too dangerous to use。不要使用它。
  • 一个问题是scanf("%d", &amp;line) 在输入缓冲区中留下一个换行符。第一个gets()——应该是fgets()——读取换行符。另一个问题是您还没有初始化string 以指向任何存储;你应该使用char string[4096]; 或类似的东西。

标签: c string input


【解决方案1】:

您的代码中的错误是您为字符串分配了内存来存储用户输入。

这里的代码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 为动态读取的每一行分配内存,并在程序结束时释放它们,然后再使用@ 返回987654328@.

同时避免将gets() 用于这些reasons

【讨论】:

  • 我将它 char *string 更改为 char string[1000]。但它仍然占用 (n-1) 行并且只打印最后一行。
  • string 应该是 2-D 数组。 char string[1000] 将只存储一行输入,即最后一行。使用char string[x][y] and also change gets() to scanf
  • scanf() 不会完成这项工作,因为它会在第一次出现任何空白时停止。建议使用 fgets()
【解决方案2】:

与其静态指定二维数组,不如指定一个指针数组,然后为添加到数组中的每个字符串分配内存。虽然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 定义来调整指针的数量。 (您也可以根据需要动态分配和重新分配它们,但这超出了您的问题范围)

【讨论】:

  • 你读过笔记了吗?并非所有版本的scanf 都使用m,一些不兼容的编译器甚至不支持它。通常 windows 使用a,但使用 codeblocks 所有的赌注都没有。
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多