【问题标题】:using isdigits , isalpha, and ispunct in C在 C 中使用 isdigits 、 isalpha 和 ispunct
【发布时间】:2020-04-28 19:54:00
【问题描述】:

我正在尝试通过用户输入来识别字母、数字和标点符号的数量,我得到了数字的数量,但字母和标点符号不正确!! .

我不知道为什么.. 这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
    char str[50];
    int alphabet = 0 , number = 0, punct = 0;
    printf("Enter your sentence: ");
    fgets(str, sizeof(str),stdin);
    for(int i=0 ; i<50; i++)
   {
       if(isalpha(str[i]) != 0)
       {
           alphabet++;
       }
       else if (isdigit(str[i]) != 0 ){
           number++;
       }
       else if (ispunct(str[i]) != 0){
           punct++;
       }
   }
    printf("Your sentence contains:\n");
    printf("Alphabets: %d",alphabet);
    printf("\nDigits: %d",number);
    printf("\nPunctuation: %d",punct);

    return 0;
}

【问题讨论】:

  • 顺便提一下,传递给isalpha和其他分类函数的参数应该是unsigned char,而不是char

标签: c for-loop counter ctype


【解决方案1】:

这个循环

for(int i=0 ; i<50; i++)

不正确。输入的字符串可以小于字符数组str的大小。

所以改为使用

for( size_t i = 0 ; str[i] != '\0'; i++ )

考虑到函数fgets可以追加换行符 \n' 到输入的字符串。如果要在循环之前将其删除,请编写

#include <string.h>

//…

str[strcspn( str, "\n" )] = '\0';

同样在 if 语句中,您应该将给定的字符转换为 unsigned char 类型。例如

   if( isalpha( ( unsigned char )str[i] ) != 0)

   if( isalpha( ( unsigned char )str[i] ) )

否则,如果字符代码为负数,则通常不强制转换此类调用会调用未定义的行为。

【讨论】:

    【解决方案2】:

    您已经硬编码了循环的上边界:for(int i=0 ; i&lt;50; i++),但是您能保证您的输入是 49 个字符吗?如果不能,那么您将读取 fgets 插入的 '\0' 之后的垃圾值。更改循环(例如):for(int i=0; i&lt;50 &amp;&amp; str[i]; i++) 以便您只循环到输入的末尾。

    或者,零初始化输入缓冲区,即char str[50] = {0};,我相信 isalpha()、isdigit() 和 ispunct() 都返回 false,输入为零,因此不会影响您的结果。

    【讨论】:

      猜你喜欢
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 2020-03-08
      相关资源
      最近更新 更多