word count英文文章计数(c语言)&指针

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LNZ001/article/details/54851551

直接,代码如下:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>

#define TEXTLEN 10000
#define TEXTBUFFER 100
#define MAXWORDS 500
#define WORDLEN 15

int main(){
	//文本处理
	char text[TEXTLEN + 1];
	char buffer[TEXTBUFFER];
	char endstr[] = "*\n";

	//字符处理
	const char space = ' ';
	const char quote = '\'';

	//单词处理
	char words[MAXWORDS][WORDLEN + 1];
	char nword[MAXWORDS];
	char word[WORDLEN + 1];
	int wordlen = 0;
	int wordcount = 0;

	//读取完整文本
	printf("输入文档,可按行回车,单行*回车结束:\n");
	while(true){
		
		//输入缓冲区部分文本,若为endstr,则结束读入.
		if(strcmp(fgets(buffer,TEXTBUFFER,stdin),endstr) == 0){
			break;
		}

		//复制到text上.
		if(strlen(text) + strlen(buffer) + 1 < TEXTLEN){
			strcat(text,buffer);
		}else{
			printf("超出限定最大文本长度.(%d)",TEXTLEN);
			return 1;
		}
	}
	
	//替换',字母,数字以外的所有符号为空格
	for(int i = 0; i < strlen(text); i++){
		if(text[i] == quote || isalnum(text[i])){
			continue;
		}
		text[i] = space;
	}
	 
	//提取单词
	int index = 0;
	while(true){

		while(text[index] == space)
			++index;

		if(text[index] == '\0')
			break;

		wordlen = 0;
		while(text[index] == quote || isalnum(text[index])){
			if(wordlen == WORDLEN){
				printf("超出单个单词最大长度.(%d)",WORDLEN);
				return 1;
			}
			word[wordlen++] = tolower(text[index++]);
		}
		word[wordlen] = '\0';

		//判定
		bool isnew = true;
		for( int i = 0; i < wordcount; i++){
			if(strcmp(words[i],word) == 0){
				++nword[i];
				isnew = false;
				break;
			}
		}
		
		//存入数组,并统计
		if(isnew){
			strcpy(words[wordcount],word);
			nword[wordcount] = 1;
			wordcount++;
		}
	}

	//输出
	for( int i = 0; i < wordcount; i++){
		if(i%3 == 0)
			printf("\n");
		printf("%-15s%5d ",words[i],nword[i]);
	}
	printf("\n");
	return 0;
}

遇到一些关于指针理解的问题:
#include <stdio.h>

int main(){
	char board[3][3] = {{'1','2','3'},{'4','5','6'},{'7','8','9'}};

	char *pboard = *board;//若为board,可以;为**board则不行.

	printf("board:%p\n",board);
	printf("board[0][0]:%p\n",board[0][0]);
	printf("&board[0][0]:%p\n",&board[0][0]);
	printf("board[0]:%p\n\n",board[0]);

	printf("*board[0]:%p\n",*board[0]);
	printf("*board:%p\n",*board);
	printf("**board:%p\n",**board);
	printf("&*&**board:%p\n\n",&*&**board);

	printf("%c\n",*(pboard + 1));


	return 0;
}

//问题:指针是否在不同编译环境下处理不同,(汇编原理?)
lnz@lnz:~/c_test$ ./a.out
board:0x7ffda32e8860
board[0][0]:0x31
&board[0][0]:0x7ffda32e8860
board[0]:0x7ffda32e8860

*board[0]:0x31
*board:0x7ffda32e8860
**board:0x31
&*&**board:0x7ffda32e8860

2
lnz@lnz:~/c_test$ 



猜你喜欢

转载自blog.csdn.net/LNZ001/article/details/54851551