c语言编程 分离单词

字符串为单位
对字符串中单词进行倒排,把已经处理的字符串打印
输入I am a student
输出student a am I

#include"stdio.h"
#include"string.h"
void RevStr(char str[])
{
int i=0,k=0;
int IsNewWord=0;
char wordtmp[50]; /*存储单词*/
char strnew[500]; /*新句子*/
strnew[0]='\0';
wordtmp[0]='\0'; /*清空字符串*/
for(i=strlen(str)-1;i>=0;i--)
{
if(((str[i]>='a')&&(str[i]<='z'))||((str[i]>='A')&& (str[i]<='Z'))) /*找到新单词*/
{
IsNewWord=1;
wordtmp[k]=str[i];
wordtmp[k+1]='\0';
k++;
}
else
{
strcat(strnew,strrev(wordtmp));/*单词翻转后连接到新句子*/
k=0;
IsNewWord=0;
wordtmp[k]=str[i];
wordtmp[k+1]='\0';
k=0;
strcat(strnew,strrev(wordtmp)); /*标点符号和空格也连接到新句子*/
}
}
strcat(strnew,strrev(wordtmp));/*最后找到的句子的第一个单词连接到新句子最后*/
puts(strnew);
}
void main()
{
char str[500];
printf("Please input:");
gets(str);
RevStr(str);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-13
#include
main()
{
int i; //循环变量
int find; //是否发现新单词
int beginw; //记录新单词的起始位置
char str[80]; //输入的源字符串
char word[80]; //放置单词的数组

gets(str);

i=0;
find = 0;
while (str[i] != '\0'){
if (str[i] != ' '){ //发现非空字符
if (find == 0){ //若是第一个非空字符 说明发现新单词
find = 1; //置位发现新单词
beginw = i; //记录新单词的位置
}
word[i-beginw] = str[i]; //将新单词保存到一字符数组中
}
else
{
if (find == 1){ //发现新单词后又发现空字符 说明新单词结束
find = 0; //标志复位
word[i-beginw] = '\0'; //写新单词结束标志
puts(word); //输出
}
}
i++;
}
if (find == 1){ //有可能有为输出的单词(当输入字符串最末字符非空时)
word[i-beginw] = '\0'; //写结束标志
puts(word); //输出
}
}

/*
输入 abcd uiui uurdj ds jk
输出 abcd
uiui
uurdi
ds
jk
不知你要的 是不是这个。 以上程序有的地方还可以简化,例如不用设置保存单词的字符数组,直接输出即可。有兴趣的话,你再修改。
*/
第2个回答  2013-06-12
char str[100] = {0};
char sub[50] = {0};
int i, j, k;

gets(str);
for(j =0, i = strlen(str)-1; i >= 0; i--) //逆序处理
{
if(str[i] != ' ' )
{
sub[j++] = str[i];
}
if(str[i] == ' ' || i == 0)
{
for(k = strlen(sub)-1; k >= 0 ; k--) //逆序输出
{
printf("%c", sub[k]);
}
j = 0;
memset(sub, 0, sizeof(sub));
if(i !=  0)
{
printf(" ");
}
}
}
printf("\n");

第3个回答  2013-06-12
#include "stdio.h"
#include "ctype.h"



void output(char **pbuffer,short count);


main()
{
    char buffer[20];
    int i,k=0;
    char *pbuffer[10]={NULL};
    short count=0;
    
    gets(buffer);
    
    for(i=0;buffer[i];++i)
    {
     if(isalpha(buffer[i]))
     {
      pbuffer[count]=(char *)malloc(10);
      
      while(isalpha(buffer[i]))
      {
       pbuffer[count][k++]=buffer[i++];
      }
      pbuffer[count++][k]='\0';
         --i,k=0;
     }
    }
    
    output(pbuffer,count);
    
    for(i=0;i<count;++i)
        free(pbuffer[i]);
}
void output(char **pbuffer,short count)
{
 int i;
 
 for(i=count-1;i>=0;--i)
     printf("%s\n",pbuffer[i]);
}

第4个回答  推荐于2017-10-14
//参考如下:
#include <stdio.h>
main()
{
int i; //循环变量
int find; //是否发现新单词
int beginw; //记录新单词的起始位置
char str[80]; //输入的源字符串
char word[80]; //放置单词的数组

gets(str);

i=0;
find = 0;
while (str[i] != '\0'){
if (str[i] != ' '){ //发现非空字符
if (find == 0){ //若是第一个非空字符 说明发现新单词
find = 1; //置位发现新单词
beginw = i; //记录新单词的位置
}
word[i-beginw] = str[i]; //将新单词保存到一字符数组中
}
else
{
if (find == 1){ //发现新单词后又发现空字符 说明新单词结束
find = 0; //标志复位
word[i-beginw] = '\0'; //写新单词结束标志
puts(word); //输出
}
}
i++;
}
if (find == 1){ //有可能有为输出的单词(当输入字符串最末字符非空时)
word[i-beginw] = '\0'; //写结束标志
puts(word); //输出
}
}

/*
输入 abcd uiui uurdj ds jk
输出 abcd
uiui
uurdi
ds
jk