【问题标题】:string checks the alphabet letters wth tabs in c pangramm字符串检查带有 c pangramm 中制表符的字母
【发布时间】:2018-03-06 13:06:17
【问题描述】:

我已经编写了这段代码,但我有一点问题。 此代码应获取一个字符串并检查此字符串是否包含所有字母... 如果不是,则输出为“不是 pangramma!”。 如果是“PanGramma!”。 问题是我希望它也计算单词之间的空格数。但是,当输入是至少有一个空格的字符串时,即使它包含所有字母,输出也将始终是“Not a PanGramma!”。 有人可以帮我吗?

    #include <stdio.h>
    char UpCase (char c);
    int isPangram (char *str);

    int main()
    {
      char str[100];
      printf("Please enter yout string: \n");
      scanf("%s", str);
      if (isPangram (str) == 1)
      {
        printf("PanGramma!\n");
      }
      else
      {
        printf("Not a PanGramma!\n");
      }

        return 0;
    }
    char UpCase (char c)
    {
      if (c>='a' && c<='z')
      {
        return c-'a'+'A';
      }
    return c;
    }
    int isPangram (char *str)
    {
     int i=0;
     int hist[27]={0};
     while (str[i] !=0)
     {
       str[i]=UpCase(str[i]);
       if (str[i] == ' ')
       {
          hist[26]++;
       }
       else
       {
          hist[str[i] - 'A']++;
       }
       i++;
     }
     for (i=0; i<26; i++)
     {
       if(hist[i] == 0)
       {
          return 0;
       }
     }
     return 1;
    }

【问题讨论】:

  • return c-'a'+'A'; 是一个不可移植的烂摊子。请改用toupper。并以类似的方式修复c&gt;='a' &amp;&amp; c&lt;='z'islower?
  • scanf 在看到空格时停止...替换为fgets 并重试。
  • 我使用了 scanf ("%[^\n]%*c", str);

标签: c string


【解决方案1】:

您的问题来自scanf 函数的使用:它确实会在它捕获的每个空白处停止。

来自man scanf

%s

匹配一系列非空白字符;下一个指针必须是一个指向字符数组的指针,它的长度足以容纳输入序列和自动添加的终止空字节 ('\0')。输入字符串在空白处或最大字段宽度处停止,以先发生者为准。

为了让你的程序正常工作,你可以使用fgets函数:

int main()
{
  char str[100];
  printf("Please enter yout string: \n");
  
  fgets(str, sizeof str, stdin);

  if (isPangram (str) == 1)
  {
    printf("PanGramma!\n");
  }
  else
  {
    printf("Not a PanGramma!\n");
  }

  return 0;
}

如果您想了解更多关于scanf 功能的信息,可以阅读A beginners' guide away from scanf()。它还会告诉你为什么scanf 会导致代码中的缓冲区溢出。

【讨论】:

    【解决方案2】:

    谢谢你们! 我用过这个 scanf ("%[^\n]%*c", str); 再次感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 2017-12-25
      • 2011-08-16
      • 1970-01-01
      • 2017-01-08
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      相关资源
      最近更新 更多