【问题标题】:geting input of string and character in a loop on c在 c 的循环中获取字符串和字符的输入
【发布时间】:2016-12-28 14:44:12
【问题描述】:

实际上,最近我发现了一个问题,我需要计算给定字符串(带有测试用例)中给定(由 oj)字符的出现次数。所以我写了这段代码,但输出不是我想要的。我是初学者所以我会非常感谢任何有指导意义的建议或帮助。谢谢。

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

int main ()
{
    int ara [123];
    char s[1000];
    int l, j, i, len;
    char c;

    scanf ("%d\n", &l);

    while (l >= 0){

        for (i = 65; i <= 122; i++)
        {
            ara[i] = 0;
        }

        fgets(s, 1000, stdin);
        len = strlen(s);

        for (i = 0;i <= len; i++)
        {
            ara[s[i]]++;
        }

        scanf(" %c\n", &c);
        j = c;
        printf("count : %d\n", ara[j]);

        l--;
    }

    return 0;
}

【问题讨论】:

  • 欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。
  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 如果发布的任何答案解决了您的问题,请记住接受它。这有助于我们所有人都知道无需采取进一步行动

标签: c


【解决方案1】:

问题在于scanf 在输入中留下了newline 以作为目标句子读取。

您可以改用fgetssscanf 来解决此问题。我还添加了一些提示,以便更容易了解预期内容。

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

int main (void)
{
    int ara [128];                          // increased array size
    char s[1000];
    char t[10];
    int l, j, i, len;
    char c;

    printf("Enter how many loops:\n");
    fgets(t, sizeof t, stdin);              // replace scanf
    sscanf (t, "%d\n", &l);                 // with sscanf

    while (l > 0){                          // changed end test

        for (i = 'A'; i <= 'z'; i++)        // replaced magic numbers
        {
            ara[i] = 0;
        }

        printf("Enter the string:\n");
        fgets(s, sizeof s, stdin);
        len = strlen(s);

        for (i = 0;i <= len; i++)
        {
            ara[s[i]]++;
        }

        printf("Enter the letter:\n");
        fgets(t, sizeof t, stdin);          // replace scanf
        sscanf (t, "%c\n", &c);             // with sscanf
        j = c;
        printf("count : %d\n", ara[j]);

        l--;
    }

    return 0;
}

节目环节

输入循环数: 2 输入字符串: 一二三四 输入字母: ○ 计数:3 输入字符串: 三七 输入字母: e 计数:4

请注意,理想情况下,您还应该检查来自fgetssscanf 的函数返回值。

【讨论】:

  • 发布此答案时,我正在编写自己的答案。所以现在我看不出有什么理由发布我的,因为原理是一样的。但有几点我认为应该补充: 1) 初始化整个ara 数组。目前这个代码有UB。在从标准输入读取的程序中,初始化所有内容所需的额外时间无关紧要。 2)在使用ara索引之前检查j的值是否在范围内
  • 和 3) 在索引到 ara 之前检查 s[i] 的值
  • @4386427 谢谢,我最后只提到了错误检查。该数组可能有 256 个元素,并带有 unsigned char 输入。还有一些其他的事情我本可以提到,但我想让答案接近问题,而不是进行详尽的重写。
  • 同意 - 有时最好专注于主要问题,让小问题过去。我只是想让 OP 有机会获得一些额外的反馈。从这里 +1。
猜你喜欢
  • 2012-01-23
  • 1970-01-01
  • 2011-07-24
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
相关资源
最近更新 更多