字符串和文本的应用

字符串和文本的应用

       C语言没有提供字符串数据类型,C语言使用char类型的数组元素存储字符串。

       字符串都以\0结尾,比如:

printf(“The character \0 is used to terminate a string.”);

       将只输出The character

 

       char string[N];只能存储一个至N-1个字符的字符串,因为必须给终止字符\0提供一个数组元素,当然也可以使用这个数组存储20个字符,但那就不是一个字符串了。

 

       使用char数组存储各种不同的字符串的主要缺点是浪费内存。因为根据定义,数组的长度是固定的,必须用足以容纳要存储的最大字符串长度来生命数组的大小。在大多数情况下,一般的字符串都会小于这个最大值,所以总是会浪费内存。

 

       如果需要合并两个字符串,一定要确定第一个字符串的可用长度要大于两个字符串的实际长度才可以哟~

 

       对于N维的数组,第一维可以不指定值,后面的几维必须指定。

 

       关于size_t类型,主要是为了移植性,代表的是unsigned int。在各种c语言中,sizeofstrlen函数的返回类型互不相同,这是又编译器的作者来决定的,把这个类型定义为size_t,并把size_t定义放在头文件中,非常便于在代码中包容这种依赖性。

 

       指针:含有地址的变量,它含有内存中另一个包含数值的位置的引用。

 

gets()和fgets()函数的区别在于,按下回车键时,gets()读取的输入会附加上一个空字符\0,而fgets()读取的输入会附加上\n\0。所以,使用fgets()的时候要特别注意,将最后添加上的\n区别对待。

 

       宽字符串常量只需要在其前面加上L修饰符即可:比如:

wchar_t proverb[] = L”A nod is as good as a wink to a blind horse”;记得如果要将宽字符输出printf,要使用%S格式限制符,而不能使用%s,免得printf函数假定字符串包含单字节字符,这样的话结果就不正确了。

 

下面是一个统计字符的程序,很不错:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>



#define TEXTLEN 10000

#define BUFFERSIZE 100

#define MAXWORDS 500

#define WORDLEN 15

const char space = ' ';

const char quote = '\'';

#define true 1

#define false 0



int main(void)

{

char text[TEXTLEN + 1];

char buffer[BUFFERSIZE];

char endstr[] = "*\n";



char words[MAXWORDS][WORDLEN + 1];

int nword[MAXWORDS];

char word[WORDLEN + 1];

int wordlen = 0;

int wordcount = 0;





printf("Enter text on an arbitrary number of lines.");

printf("\nEnter a line containing just an asterisk(*) to end input:\n\n");



//read an arbitrary number of lines of text

//while(true)

while(1)

{

//a string containing an asterisk followed by newline

//signals end of input



if(!strcmp(fgets(buffer,BUFFERSIZE,stdin),endstr))

break;



//check if we have space for latest input

if(strlen(text) + strlen(buffer) +1 > TEXTLEN)

{

printf("Maximun capacity for text exceeded. Terminating program.");

return 1;

}

strcat(text,buffer);

}



//plus the rest of the program code....



//replace everything except alpha and single quote characters by spaces

int i;

for(i = 0; i < strlen(text);i++)

{

if(text[i] == quote || isalnum(text[i]))

continue;

text[i] = space;

}





//find unique words and store in words array

int index = 0;

while(1)

{

//ignore any leading space before a word

while(text[index] == space)

++index;



//if we are at the end of the text, we are done

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

break;



//extract a word

wordlen = 0;

while(text[index] == quote || isalpha(text[index]))

{

//check if word is too long

if(wordlen == WORDLEN)

{

printf("Maximun word length exceeded. Terminating program.");

return 1;

}

word[wordlen++] = tolower(text[index++]);

}

word[wordlen] = '\0';



//check for word already stored

int isnew = true;

for(i = 0; i < wordcount;i++)

if(strcmp(word,words[i]) == 0)

{

++nword[i];

isnew = false;

break;

}



if(isnew)

{

//check if we have space for another word

if(wordcount >= MAXWORDS)

{

printf("\n Maximun word count exceeded. Terminating program.'");

return 1;

}

strcpy(words[wordcount],word);

nword[wordcount++] = 1;

}

}

//output the words and frequencies

for(i =0;i<wordcount;i++)

{

if(!(i%3))

printf("\n");

printf("%-15s%5d ",words[i],nword[i]);

}

printf("\n");

return 0;

}