请教一道C语言程序设计

/*----------------------------------------------------------------------
【程序设计】
------------------------------------------------------------------------
题目:程序将英文句子中各单词首字母改成大写,并将各单词分行显示。单词间
      的空格数不定。
例如:英文句子为"welcome to    c     world "
      程序运行结果为:
      Welcome
      To
      C
      World 

------------------------------------------------------------------------
注意:请勿改动程序中的其他内容。
----------------------------------------------------------------------*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>

int main()
{
    char s[]= "welcome     to c world ";
    int i,inword;
    inword=0;
    /**********Program**********/
    for(i=0;s[i];++i)
    {
        if(isalpha(s[i]))
        {
            if(inword==0)
            {
                s[i]=s[i]-32;
                inword=1;
            }
            putchar(s[i]);
        }
        else
        {
            if(inword==1)
            {
                inword=0;    
                printf("\n");
            }   
        }
    }  
    /**********  End  **********/
    return 0;
}

哪个地方不理解

int main()
{
    char s[] = "welcome     to c world ";
    int i, inword;
    inword = 0;
    /**********Program**********/
    for (i = 0; s[i]; ++i)
    {
        if (isalpha(s[i]))//如果s[i]是字母,则为真
        {
            if (inword == 0)//找到第一个字母
            {
                s[i] = s[i] - 32;//根据ascii码表,A 比 a 小32
                inword = 1;//防止welcome整串大写
            }
            putchar(s[i]);//打印s[i]
        }
        else//当 Welcome 打印完了之后,后面是字符'\0'不是字母,所以判断来这
        {
            if (inword == 1)
            {
                inword = 0;//重置,找第一个字母
                printf("\n");//换行
            }
            //重置之后else语句里面当成空语句
        }
    }
    /**********  End  **********/
    return 0;
}

有帮助的话还请采纳~


/*----------------------------------------------------------------------
【程序设计】
------------------------------------------------------------------------
题目:程序将英文句子中各单词首字母改成大写,并将各单词分行显示。单词间
      的空格数不定。
例如:英文句子为"welcome to    c     world "
      程序运行结果为:
      Welcome
      To
      C
      World 
------------------------------------------------------------------------
注意:请勿改动程序中的其他内容。
----------------------------------------------------------------------*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
 
int main()
{
    char s[]= "welcome     to c world ";
    int i,inword;
    inword=0; // 0:没有找到单词, 1:找到单词了
    /**********Program**********/
    for(i=0;s[i];++i)
    {
        if(isalpha(s[i])) // 是字母
        {
            if(inword==0) // 没有找到单词 ,说明前面是空格
            {
                s[i]=s[i]-32; // 小写字母转大写字母
                inword=1; // 设置找到了单词
            }
            putchar(s[i]); // 输出字母
        }
        else // 不是字母
        {
            if(inword==1) // 如果前面找到过单词
            {
                inword=0;   // 设置没有找到单词
                printf("\n"); // 需要换行,方便下一个单词输出
            }   
        }
    }  
    /**********  End  **********/
    return 0;
}

inword表示找到了一个单词
它是0的时候就是还没有开始进入单词
是1的时候表示进入了一个单词

该回答引用ChatGPT4与博主@晓码自在合作编写:

这里是该程序的解答:

c
#include<stdio.h>
#include<string.h>
#include<math.h> 
#include<ctype.h>
#include<stdlib.h>

int main()
{
    char s[]= "welcome     to c world ";
    int i,inword;
    inword=0;
    
    for(i=0;s[i];++i)
    {
        if(isalpha(s[i]))
        {
            if(inword==0)
            {
                s[i]=toupper(s[i]);   // 将字母转换为大写
                inword=1;
            }
            putchar(s[i]);
        }
        else
        {
            if(inword==1)     // 如果前面是一个单词,则换行
            {
                inword=0;
                printf("\n");
            }
        }
    }  
    return 0;
}

这个程序的关键是:

  1. 使用isalpha判断当前字符是否是字母
  2. 如果是字母,且前面没有单词(inword==0),则使用toupper将第一个字母转换为大写,并将inword标记为1,表示当前是单词内
  3. 如果不是字母,且前面是一个单词(inword==1),则换行并将inword标记为0
  4. 重复以上步骤直至字符串结束

通过这些逻辑,可以实现识别每个单词,并将其首字母大写及单独占一行的要求。