【问题标题】:How to input two strings separated by new line in C如何在C中输入由换行符分隔的两个字符串
【发布时间】:2018-07-17 12:25:31
【问题描述】:

如何输入 2 个以换行符分隔的字符串?

我的问题:

首先我需要给出我需要获取多少个字符串,然后我需要获取这些字符串然后显示它。

我试过了:

代码:

#include <stdio.h>
#include <string.h>

int main()
{

    int n,i = 0;
    scanf("%d", &n);
    char arr[n][100];
    for(int i = 0; i < n; i++)
    {
        scanf("%[^\n]s", arr[i]);
    }

    for(int i = 0; i < n; i++)
    {
        printf("%s\n", arr[i]);
    }

    return 0;
}

我的输入是:

2 I am
Aravind

我的输出是:

I am
þ

第一行我得到了正确的一个,但第二行显示了一些垃圾值。帮我解决这个问题。

【问题讨论】:

    标签: c arrays string multidimensional-array


    【解决方案1】:

    你有两个主要问题:

    1. "%[" 格式以结尾"]" 结尾,结尾不应有"s"

    2. "%[" 格式不会跳过前导空格,例如在您阅读的第一行之后出现的换行符。

    这两个问题都可以通过使用fgets 读取整行来轻松解决。

    【讨论】:

    • 您好,除了 fgets 还有其他方法吗?
    • @AravindEkan 要仅使用标准 C 函数读取行,最好的解决方案是 fgets。您可以使用scanf(和家庭),但它变得更加复杂,并且没有字段宽度限制器也很容易导致缓冲区溢出。
    • 第三个问题,没有宽度限制。 "%[^\n]" 类似于 gets()。是的,最好使用fgets()
    【解决方案2】:

    您已经建议不要使用scanf。但是,如果您“必须”使用scanf,那么您可以考虑以下方法:

    • 对于动态内存分配,您应该使用 malloc
    • 换行符保留在标准输入中,因此需要刷新或处理/忽略

    这是更新后的代码。

    int main()
    {
        int n,i = 0;
        scanf("%d", &n);
    
        scanf("%*[\n]"); 
        /*this will read the \n in stdin and not store it anywhere. So the next call to 
         * scanf will not be interfered with */
    
        char **inputs;
        inputs = malloc(n * sizeof(char *));
    
        for (i = 0; i < n; i++)
        {
           inputs[i] = malloc(100 * sizeof(char));
        }
    
    
        for(i = 0; i < n; i++)
        {
            scanf("%*[\n]");
            scanf("%100[^\n]", inputs[i]);
        }
    
        for(i = 0; i < n; i++)
        {
            printf("%s\n", inputs[i]);
        }
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      使用gets(arr[i]) 代替scanf。

      【讨论】:

      • 永远不要永远使用getsIt's a dangerous function,因此已从 C 标准中删除(很久以前就被弃用了)。
      猜你喜欢
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 2010-10-19
      相关资源
      最近更新 更多