NIGHTLOS0011 2022-10-21 17:30 采纳率: 75%
浏览 205
已结题

C语言统计字符串内单词个数,并把每个单词字母翻转

C语言统计字符串内单词个数,并把每个单词字母翻转
rt,要求是输入一段英文(有标点),最后统计这句话一共多少个单词并输出数字,第二行输出翻转后的单词(没有标点,每个单词后带空格,句子顺序不变)。我的代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
    int i,j,stx;
    char a[500];
    while(gets(a))
    {
      int len= strlen(a);
      int sum=0;
      for(i=0;i<len;i++)
      {
          if(a[i]==' ')
          sum=sum+1;
      }
      printf("%d\n",sum+1);
      int flag=0;
      a[len]=' ';
      char b[500];
      int k=0;
      stx=0;
    while(stx<len)
    {
    for(i=stx;i<=len;i++)
    {
        if((a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z'))
          {
              b[k]=a[i];
            k++;
            continue;    
        }
        if(a[i]==' ')
        { 
          flag++;
          break;
        }
        if(a[i]=='.'||a[i]=='?'||a[i]==','||a[i]=='!')
        {
          flag++;
          continue;  
        }
    }
      for(int r=k-1;r>=stx-1;r--)
          {
            printf("%c",b[r]);
          }
        stx=stx+flag+k;
    }
      printf("\n");
    }
    return 0;
}

现在的问题是我输出的英语单词只有前两个,比如:
I love China.
输出 i evol 就没了。每个标点符号后面也空一个格方便统计单词,求解答。

  • 写回答

1条回答 默认 最新

  • 浪客 2022-10-21 18:16
    关注
    
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    int main()
    {
        int i, j;
        char a[500];
        while (gets(a))
        {
            int len = strlen(a);
            int sum = 0;
            for (i = 0; i < len; i++)
            {
                if (a[i] == ' ')
                    sum = sum + 1;
            }
            printf("%d\n", sum + 1);
            char b[500];
            int k = 0;
            char t;
            for (i = 0; i < len; i++) //
            {
                if ((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')) //
                {
                    b[k++] = a[i];
                }
                else if (a[i] == ' ' || ispunct(a[i]))
                {
                    if (k == 0)
                        continue;
                    if (ispunct(a[i - 1]))
                        k--;
                    for (j = 0; j < k / 2; j++)
                    {
                        t = b[j];
                        b[j] = b[k - j - 1];
                        b[k - j - 1] = t;
                    }
                    b[k] = 0;
                    printf("%s ", b);
                    k = b[k] = 0;
                }
            }
            printf("\n");
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 创建了问题 10月21日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。