user-0 提问: 字符串中单词的个数

回复:
user: user-1
content: 引用 8 楼 Gloomy00my 的回复:[quote=引用 5 楼 u014444402 的回复:]  int GetWordNum( char str[] ) {     int num = 0; 	unsigned char space = 1;      	while ( *str ) 	{ 		if ( *str == ' ' ) 		{             space = 1; 		} 		else 		{ 			if ( space ) 			{                num++; 		       space = 0; 			} 		}  		str++; 	} 	return num;  }   如果单词与单词之间有多个空格  这个代码是不是就不对。。。[/quote] 提问没有错，可是你问这个代码对不对就错了，你不会试试啊？

user: user-2
content: 你只用一个num来统计，当然不行了，字符串也是有长度的啊 参考一下别人的吧——http://blog.csdn.net/sxhelijian/article/details/7307580

user: user-3
content: 引用 7 楼 Gloomy00my 的回复:[quote=引用 1 楼 xpdavis 的回复:] 一个循环搞定的事情呀，如果你是来求代码的话，那就很无语了。 不想动脑筋亲自写代码的话，怎么可能进步呢？或者考虑放弃做点别的吧 #include<stdio.h> int main() {char a[100]; int i,num=0; gets(a); for(i=0;*(a+i)!='\0';i++) {   	if(*(a+i)==' ')  	continue;  	else  	num++; } printf("单词的个数为：%d\n",num); }   这是我的代码   但它不对  [/quote] 用一个状态来记录单词状态，每次非单词状态（包括初始状态）进入单词状态的时候加1

user: user-3
content: 引用 18 楼 mymtom 的回复:[quote=引用 17 楼 xpdavis 的回复:] 这么点小东西，居然惊动版主，楼主面子不小啊。这么简单的程序，还是建议初学者自己编写，每个人大牛都是从菜鸟开始的 其实我只是想推荐"The C Programing Language" 如果英语还凑合，这时最好的C语言入门书[/quote] 嗯嗯，强推 初学者要尽量自己写代码，这样进步才会看快

user: user-4
content: 引用 17 楼 xpdavis 的回复:这么点小东西，居然惊动版主，楼主面子不小啊。这么简单的程序，还是建议初学者自己编写，每个人大牛都是从菜鸟开始的 其实我只是想推荐"The C Programing Language" 如果英语还凑合，这时最好的C语言入门书

user: user-3
content: 这么点小东西，居然惊动版主，楼主面子不小啊。这么简单的程序，还是建议初学者自己编写，每个人大牛都是从菜鸟开始的

user: user-4
content: 只需要尽心三行改动，就可以得到一个wc函数  /**  * @file    wc.c  * @brief   count lines, words, and characters in input.  */  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define IN  1   /* inside a word */ #define OUT 0   /* outside a word  */   int wc(const char *s)                       /* TODO: 1 */ {     int c, nl, nw, nc, state;     const char *p = s;                  /* TODO: 2*/      state = OUT;     nl = nw = nc = 0;     while ( (c = *(p++)) != '\0') {     /* TODO: */         ++nc;         if (c == '\n')             ++nl;         if (c == ' ' || c == '\n' || c == '\t')             state = OUT;         else if (state == OUT) {             state = IN;             ++nw;         }     }     printf("%d %d %d\n", nl, nw, nc);      return 0; }   int main(int argc, char *argv[]) {     char *ptr;     char *buf;     char  line[128];      ptr = buf = malloc(1024 * 1024);     while (fgets(line, sizeof(line), stdin) != NULL) {         ptr += sprintf(ptr, "%s", line);     }      wc(buf);      free(buf);      return 0; }

user: user-4
content: 参考 "The C Programing Language" 的例子吧！  /**  * @file    wc.c  * @brief   count lines, words, and characters in input.  */  #include <stdio.h>  #define IN  1   /* inside a word */ #define OUT 0   /* outside a word  */  int main(void) {     int c, nl, nw, nc, state;      state = OUT;     nl = nw = nc = 0;     while ( (c = getchar()) != EOF) {         ++nc;         if (c == '\n')             ++nl;         if (c == ' ' || c == '\n' || c == '\t')             state = OUT;         else if (state == OUT) {             state = IN;             ++nw;         }     }     printf("%d %d %d\n", nl, nw, nc);      return 0; }

user: user-5
content: 参考《编译原理》中的词法分析和有限状态自动机。

user: user-6
content: 在《c程序设计语言》上面有这个问题的讲解。我就给出我自己的代码。 /*************************************************************************     > File Name: nword.c     > Author: Jukay     > Mail: iloveyouljxcc@163.com      > Created Time: 2014年10月17日 星期五 12时33分29秒  ************************************************************************/ #define IN 1 #define OUT 0 #include<stdio.h> #include<string.h> int main() { 	char string[] = " Hi guys, Do you like programing by c"; 	int nword(const char *); 	printf("%d\n",nword(string)); 	return 0; }  int nword(const char *str) { 	int state =OUT; 	int nword=0; 	int i=0; 	for(;i < strlen(str);i++ ) 	{ 		if(state == OUT) 		{ 			if(str[i] !=' ') 			{ 				nword++; 				state =IN; 			} 		} 		if(state == IN) 		{ 			if(str[i] ==' ') 			{ 				state =OUT; 			} 		} 	} 	return nword; }

user: user-7
content: 思路：用一个状态标记上一个字符是否是英文字符，如果如果当前字符为空格并且上个字符是字符，则单词数加一，状态改为假；如果当前字符不是空格，则状态改为真。 至于具体的代码就自己好好写一下啦~不懂再问吧~

user: user-0
content: 引用 5 楼 u014444402 的回复: int GetWordNum( char str[] ) {     int num = 0; 	unsigned char space = 1;      	while ( *str ) 	{ 		if ( *str == ' ' ) 		{             space = 1; 		} 		else 		{ 			if ( space ) 			{                num++; 		       space = 0; 			} 		}  		str++; 	} 	return num;  }   如果单词与单词之间有多个空格  这个代码是不是就不对。。。

user: user-0
content: 引用 1 楼 xpdavis 的回复:一个循环搞定的事情呀，如果你是来求代码的话，那就很无语了。 不想动脑筋亲自写代码的话，怎么可能进步呢？或者考虑放弃做点别的吧 #include<stdio.h> int main() {char a[100]; int i,num=0; gets(a); for(i=0;*(a+i)!='\0';i++) {   	if(*(a+i)==' ')  	continue;  	else  	num++; } printf("单词的个数为：%d\n",num); }   这是我的代码   但它不对

user: user-8
content: 你看可以么。  #include <stdio.h> #include <string.h>  int main() { 	char chInfor[256] = "I'm  a     good student!"; 	char* p = strtok(chInfor, " "); 	int counter = 0; 	while (p != NULL) 	{ 		counter++; 		printf("%s\n", p); 		p = strtok(NULL, " "); 	} 	printf("%d\n", counter); 	return 0; }

user: user-1
content: int GetWordNum( char str[] ) {     int num = 0; 	unsigned char space = 1;      	while ( *str ) 	{ 		if ( *str == ' ' ) 		{             space = 1; 		} 		else 		{ 			if ( space ) 			{                num++; 		       space = 0; 			} 		}  		str++; 	} 	return num;  }

user: user-3
content: 对于初学者，不建议strtok LS的意思让他还没学会走，就要学会飞？

user: user-9
content: strtok就搞定了.  搜索msdn例子

user: user-10
content: 大部分的做法都通过循环来实现的

user: user-3
content: 一个循环搞定的事情呀，如果你是来求代码的话，那就很无语了。 不想动脑筋亲自写代码的话，怎么可能进步呢？或者考虑放弃做点别的吧