【问题标题】:Is it possible to prompt for a single user input to use in multiple scanf functions?是否可以提示单个用户输入以在多个 scanf 函数中使用?
【发布时间】:2017-08-22 01:11:24
【问题描述】:

所以我会详细说明标题 -

我声明了一些函数,然后在main 中调用它们。 所有函数都使用scanf,并且应该在相同的输入上执行它们的操作。

我的问题是我被提示为每个函数提供一个输入(每个 scanf),但我想要一个提示。考虑到所有函数都使用相同的输入,我认为这很简单。

不过,这里有个大问题 - 我的输入保证是一系列字母(即一个单词 - 比如“你好”),我不能使用任何类型的字符串、数组或指针。

我在任何地方都没有发现任何关于此的内容。这个可以吗?

编辑 - 示例代码:

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

/*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^
functions - all the functions we later call for in 'main'
*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*/

//*^*^*^*^*^*^* function 1 (find sum of letter values)
int word_sum() {
    char letter = '\0';
    int sum = 0;
    while (letter != '.') {
        sum += (int)letter;
        scanf("%c", &letter);
    }
    return sum;
}

//*^*^*^*^*^*^* function 2 (number of letters in input)
int char_count() {
    char letter = '\0';
    int i = 0;
    for (i = 0; letter != '.'; i++) {
        scanf("%c", &letter);
    }
    return i - 1;
}
//*^*^*^*^*^*^* function 3 (does something with same input)
//more functions

/*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^
main
*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*/
int main() {
    printf("Enter word:\n");

    printf("the sum is %d\nchar num is %d\a", word_sum(), char_count());

    return(0);
}

/* ===================
input = hi.

desired output -
--------------------------
Enter word:
hi.

the sum is 209
char num is 2
--------------------------
current output - 
--------------------------
Enter word:
hi.
hi.
the sum is 219
char num is 2
--------------------------
=====================*/

我使用“。”在输入结束时,因为我们保证我们得到的所有输入都会以它结束。

如图所示,我无法使用单个提示来初始化这两个函数。

我不仅要输入两次这个词,而且(我猜)因为它还读取“新行”或其他内容,甚至函数结果也会出现偏差。

我知道这可以通过单个函数和 scanf 来完成。 但我以后至少会有 5 个函数,而且每个函数都有行数限制。所以看来我最终不得不以一种或另一种方式面对这个问题。

话虽如此,如果您能想出一个不同的解决方案来维护这些功能,那么它可能是相关的。

非常感谢大家迄今为止的所有帮助!

【问题讨论】:

  • “不能使用任何类型的字符串、数组或指针”——有点限制你的选择,不是吗?
  • 是的,很遗憾。这是家庭作业的一部分...
  • 你需要提供一些代码;你的问题不清楚。您将如何使用scanf() 来读取像hello 这样的输入而不将该输入存储在数组中? scanf() 将如何对同一输入多次执行不同的操作?目标是什么?
  • 您可以将char myLetter = 'h' 与字母e l l o 然后printf("%c", myLetter) 并排使用。您需要使用字符类型。 gl 与家庭作业/scanf("%c", myLetter)
  • 你怎么说this

标签: c function input scanf


【解决方案1】:

您需要做的是将您的实际函数分解为步进函数,这些函数将对单个字符执行一步计算 -

int sum_word(char letter, int previous_sum) {
    return letter + previous_sum;
}

int count_word(char letter, int previous_count) {
    return previous_count + 1;
}

现在您需要逐个字符地读取并将每个步骤处理为

void process_input(void) {
    char c;
    sum=0, count=0;
    while(scanf("%c", &c) == 1 && c != '\n'){
        sum = sum_word(c, sum);
        count = count_word(c, count);
    }
    printf ("Sum = %d, Count = %d\n", sum, count);
}

如果您不想每次都传递它们,也可以将全局/静态变量用于 sum 和 count。

现在无论您想做什么其他操作,只需为它们制作类似的单字母处理函数,然后在我调用sum_wordcount_word 的地方调用它们。

当然,您不能只支持可以分解为阶跃函数的函数。不支持需要回看的功能。

【讨论】:

  • 所有函数都使用scanf
  • @BLUEPIXY 这就是 OP 所做的。这是必需品吗?如果是,我们可以通过简单的ungetc 绕过它
  • 对我来说模棱两可的东西太多了……不知道ungetc能不能用。请咨询 OP 而不是我。
  • 这似乎符合我的要求,尽管我需要重新编写大部分代码,但这仍然符合我提出的解决方案的逻辑。最重要的是,这在我们目前所学的范围内(我们已经开课三周了)。希望它有效,我会告诉你!
  • Ajay 和@BLUEPIXY,非常感谢你们,你们都非常乐于助人,内容丰富!!谢谢
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
相关资源
最近更新 更多