【问题标题】:Input an arbitrary number of strings from the user [duplicate]从用户输入任意数量的字符串[重复]
【发布时间】:2012-05-10 18:18:25
【问题描述】:

我想读取任意数量的字符串,一次一个,使用 C 语言中的<stdio.h>。 我知道你可以用整数来做到这一点:

while (scanf("%d ", &integer))

但我做不到:

while (scanf("%s", string))

我怎样才能实现上述?

输入在不同的行上。

【问题讨论】:

  • 永远不要使用scanf("%s") - 请参阅stackoverflow.com/questions/4023895/…
  • 如果您绑定了字符串大小(根据您链接到的答案),您可以使用 scanf。
  • 阅读完每个字符串后,您想对它做什么?使用scanf("%s", ...) 将在循环的每次迭代中为您提供一个新的空格分隔单词,但大概您将在读取下一个之前对读取的值做一些事情。那个“东西”将决定你如何处理下一个单词的存储。
  • 我想从输入位串创建一个二叉树,所以 scanf("%s"...) 然后为该字符串创建二叉树,然后继续下一个字符串,直到没有更多输入中的字符串

标签: c string file-io


【解决方案1】:

通常希望使用fgets 将输入读取为字符串,尤其是当您希望一行输入以一个字符串结尾时。

可以还使用fscanf 和扫描集转换来一次读取一行,例如:

char line[100], newline;

fscanf("%99[^\n]%c", line, &newline);

然后你可以通过newline=='\n'来判断你是否已经成功读取了整行,或者该行大于你提供的缓冲区。

当您尝试读取面向行的输入时,您通常希望避免使用“%s”(即使具有指定长度),因为这会读取空格分隔的标记,而不是整行。

【讨论】:

  • fgets 将无法识别点击,只需输入:(
  • 哦,会的! fgets() 会识别一个简单的输入;这将是一个“空”行,仅包含换行符。
  • @WasiqKashkari:“不会识别”是什么意思?它会将其读取为仅包含 new-line 的字符串。
  • 我不知道,如果我按回车,scanf 不会返回,所以如果我调试它,按回车不会让调试器跳到下一行代码
  • @JerryCoffin link 我想我在这里问得更好
【解决方案2】:

使用 char 数组:

char charArray[100];
while (scanf("%s", &charArray))

【讨论】:

  • 4 有点短,不是吗?而且你不希望&charArray 前面。我推荐scanf("%99s", charArray) 来防止缓冲区溢出。
  • 你能说“缓冲区溢出”吗,小尤尔根? :-)
  • no 使用 char 数组不起作用。 while 循环永远不会结束
  • 我想要它,所以如果用户只是按回车键,while 循环就结束了??
  • @WasiqKashkari 如果您只需要一行输入,请使用fgets()。处理起来比scanf()简单多了。
【解决方案3】:

我猜你的问题是终止循环。 scanf 返回成功扫描元素的数量。如果是字符串,则空字符串也被成功扫描。因此,您需要另一个标准,例如

 while(scanf("%s",string)  && (strlen(string)!=0))

【讨论】:

  • 不不不,scanf 无法识别按 Enter 作为输入。
【解决方案4】:

我没有完全理解你最初的问题想要做什么。当你说你想读取任意数量的字符串时,我的意思是,你希望你的程序能够读取 0 到 n 个字符串。不幸的是,在 C 中,您要么必须限制您想要读取的最大字符串数,例如 #define MAX_NUMBER_OF_STRINGS_TO_READ 25,或者进入一些复杂的内存分配方案来读取一个字符串,然后将它添加到动态内存(从 malloc 返回)。

我采用了最大字符串数的方法并写了以下sn-p:

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

char charArray[5][25] = {0};

int main(int argc, char *argv[])
{
    int in_idx = 0;
    int out_idx = 0;

    printf("\n\n%s\n", "Enter no more than 5 strings, no more than 25 characters long.");

    while(fgets (charArray[in_idx], 25, stdin))
    {
        if('\n' == charArray[in_idx][0])
        {
            printf("%s\n", "Entry terminated with newline.");
            break;
        }

        in_idx++;
    }

    for(out_idx=0; out_idx < (in_idx + 1); out_idx++)
    {
        printf("%s", charArray[out_idx]);
    }

    printf("\n%s\n", "Program ended.");

    return 0;
}

我将终止字符设置为换行符。如果我只想要两个字符串,则在输入第二个字符串时按 Enter。我通过在字符数组的第一个位置查找“\n”来终止 fgets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2013-02-10
    相关资源
    最近更新 更多