weixin_55413326 2023-12-14 14:10 采纳率: 100%
浏览 11
已结题

为什么这样写完运行,只能输入一行字符,无法输入第二行字符呀

/*  

   编程:输入若干行由英文字母和其他符号组成的字符串,求这些字符串中包含了几个不同的英文字母。
   当输入字符串为end时结束输入,且不统计end中的英文字母。 
   注:同一英文字母的大、小写视为不同的字母,每行字符串长度不超过128。 
----------------------------------------------------------------------------   
   输入样例: 
   Hello Wo
   Slas    
   end
   输出样例:
    8 
----------------------------------------------------------------------------
  以上是题目,不要更改,从下面开始答题!!!
*/



#include <stdio.h>
int main()
{
    char a[129]={'\0'};
    int b[124]={0};
    int i,sum=0;
    while(a[0]!='e'||a[1]!='n'||a[2]!='d')
    {
    gets(a);
    while(a[i]!='\0')
    b[a[i]]=1;
    
    for(i=65;i<=91;i++)
    sum+=b[a[i]];
    for(i=97;i<=123;i++)
    sum+=b[a[i]];
    getchar();
    }
    printf("%d",sum);
    return 0;
}


  • 写回答

2条回答 默认 最新

  • 爱编程的鱼 2023-12-14 14:27
    关注

    以下是修改后的代码:

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    int main() {
        char string[128];
        int unique_letters[26] = {0};
        int count = 0;
        
        while (1) {
            fgets(string, sizeof(string), stdin);
            
            if (strcmp(string, "end\n") == 0) {
                break;
            }
            
            for (int i = 0; string[i] != '\0'; i++) {
                if (isalpha(string[i])) {
                    char lowercase = tolower(string[i]);
                    int index = lowercase - 'a';
                    
                    if (unique_letters[index] == 0) {
                        unique_letters[index] = 1;
                        count++;
                    }
                }
            }
        }
        
        printf("%d\n", count);
        
        return 0;
    }
    

    这里的修改主要包括以下几点:

    1. 使用fgets函数替代gets函数,fgets函数更安全,可以避免缓冲区溢出的问题。
    2. b数组的大小从124修改为256,因为ASCII码表中的字符范围是0-255。
    3. for循环中,将字符的ASCII码作为索引时需要减去相应的偏移量,即65和97,才能正确对应到字母的位置。
    4. 在每次循环结束后,使用getchar函数来清除输入缓冲区中的换行符,以便下一次输入。

    这样修改后的代码应该能够正确地输入多行字符并统计不同的英文字母数量。如果还有其他问题,请随时提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 已采纳回答 12月14日
  • 创建了问题 12月14日