再论句子中单词的逆序输出

今天,有个朋友看了我的一篇关于将句子中单词次序翻转并输出的文章,说这个程序只做到了输出,没有存储,实用不大。链接在下面!

http://blog.csdn.net/persistvonyao/article/details/16909199

对此,我思考良久,决心重写这个程序!

下面是我重写的程序:

#include <stdio.h>
#include <stdlib.h>

#define N 128

/*
 * @author: 冯克
 * @date:	2014.1.3
 * @brief:	将输入的以空格隔开的字符串以单词为最小单位,逆序排列!
 * @param:	word_str	输入的字符串
 * @return:	success 	返回排序好的字符串
 * 			fail		NULL
 * */

char *convertwordsort(char *word_str)
{
	char *buf;
	int i = 0;
	int j = 0;
	int max = 0;
	int tmp = 0;
	int max2 = 0;
	int min2 = 0;

	/* 申请空间 */
	buf = (char *)malloc(sizeof(char) * N);

	/* 判断输入的字符串是否为空指针 */
	if(word_str == NULL)
	{
		perror("it's NULL string! error");
		return NULL;
	}

	/* 将字符串放入数组buf中,方便进行排序 */
	while(*word_str != '\0')	
	{
		buf[i++] = *word_str; 
		word_str++;
	}

	/* 存储字符的数目 */
	max = i - 1;

	/* 将buf中的字符串逆序 */
	for(i = 0; i < max / 2 + 1; i++)
	{
		tmp = buf[i];
		buf[i] = buf[max - i];
		buf[max - i] = tmp;
	}

	//printf("%s\n", buf);
	/* 将逆序的字符串中的单词分别在逆序 */
	for(i = 0; i < max + 2; i++)
	{
		if(buf[i] == '\0')
		{
			/* 对最后一个单词进行排序 */
			max2 = i - 1;
			for(j = min2; j - min2 < (max2 - min2) / 2 + 1; j++)
			{
				tmp = buf[j];
				buf[j] = buf[max2 - j + min2];
				buf[max2 - j + min2] = tmp; 
			}

			break;
		}
		else if(buf[i] == 32)/* 对前面以空格结尾的各个单词进行排序 */
		{
			max2 = i - 1;
			for(j = min2; j - min2 < (max2 - min2) / 2 + 1; j++)
			{
				tmp = buf[j];
				buf[j] = buf[max2 - j + min2];
				buf[max2 - j + min2] = tmp; 
			}
			min2 = i + 1;
		}
	}

	return buf;/* 返回逆序的单词 */	
}

/* 测试程序 */
int main(int argc, const char *argv[])
{
	char *str = "this is a test, thank you for your reading!";
	char *result;

	result = convertwordsort(str);
	printf("%s\n", result);

	return 0;
}

由于本人水平有限,如有疑问,请联系我!qq:278932578  冯克

posted @ 2014-01-03 21:56  vonyao  阅读(198)  评论(0编辑  收藏  举报