直接,代码如下:
#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$