user-0 提问: 华为oj——字符串最后一个单词的长度

回复:
user: user-1
content: 问题有二： 1、严格的 c 语言遵循一条规则：所有的变量在函数一开始的地方集中申请，变量申请前不得有其他代码。你的 int the_count = 0; 应该提到前面来，放到 string_name 和 temp 一道申请。你的程序如果是 c 程序（扩展名用的.c）就会编译报错，如果是 c++ （扩展名用的.cpp），编译器会忽略这条规则。 2、string_name[128] 数组没初始化，输入完成后 c 的值是数组长度，cal 函数直接 p[c] 这样用是有问题的，得到的值是未知的。解决办法是初始化 string_name 或者输入完成后在 do…while 循环后面加句 string_name[c] = 0;

user: user-2
content: #include "stdio.h" #include "string.h" #include "stdlib.h" /* #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> */ int cal(char p[128]); int c = 0;  int main() {     char string_name[128], temp;     int the_count = 0;      printf("Please input the string:");     do     {         temp = getchar();         string_name[c] = temp;         c++;     } while (temp != '\n');      the_count = cal(string_name);     printf("the length of the last word is %d\n", the_count);     //system("pause");      return 0; } int cal(char p[128]) {     int n = 0;     int t = 0; #ifndef  isalpha     puts("haha");     while (!(p[c] >= 'a'&&p[c] <= 'z') &&             !(p[c] >= 'A'&&p[c] <= 'Z'))     {         c--;     } #else     while (!isalpha(p[c]))         c--; #endif     for (t = c; p[t] != '\0' && p[t] != ' '; t--) {         n++;     }     return n; }  没有逻辑问题，对你的代码稍微改了一些格式。

user: user-3
content: system("pause"); 这个命令只在windows有效吧，去掉试试

user: user-0
content: 终于改对了，好久没敲过了，看样子编程真的要细心啊== #include <stdio.h> #include <string.h> #include <stdlib.h>  void main() { 	char string_name[128]; 	int c = 0; 	int n = 0; 	int t = 0;  	gets(string_name); 	c = strlen(string_name);  	while (!(string_name[c] >= 'a'&&string_name[c] <= 'z') && 		!(string_name[c] >= 'A'&&string_name[c] <= 'Z')) 	{ 		c--; 	} 	t = c; 	while (string_name[t] != '\0'&&string_name[t] != ' '&&t >= 0 		&& ((string_name[t] >= 'a'&&string_name[t] <= 'z') || (string_name[t] >= 'A'&&string_name[t] <= 'Z'))) 	{ 		t--; 		n++; 	}   	printf("%d\n", n); 	system("pause"); }

user: user-4
content: 网上找下AC的代码吧。 1.看看你们的输入输出格式是不是一致 2.多测试一些样例

user: user-0
content: 引用 8 楼 ghost129 的回复:for (t = c; p[t] != '\0' && p[t] != ' '; t--)改成 for (t = c; p[t] != '\0' && p[t] != ' ' && t >= 0; t--) 恩恩，这里忘记了。但提交后还是运行错误=_=

user: user-1
content: for (t = c; p[t] != '\0' && p[t] != ' '; t--)改成 for (t = c; p[t] != '\0' && p[t] != ' ' && t >= 0; t--)

user: user-0
content: 引用 6 楼 cfjtaishan 的回复:[quote=引用 4 楼 innocent_sheld 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:]  #include "stdio.h" #include "string.h" #include "stdlib.h" /* #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> */ int cal(char p[128]); int c = 0;  int main() {     char string_name[128], temp;     int the_count = 0;      printf("Please input the string:");     do     {         temp = getchar();         string_name[c] = temp;         c++;     } while (temp != '\n');      the_count = cal(string_name);     printf("the length of the last word is %d\n", the_count);     //system("pause");      return 0; } int cal(char p[128]) {     int n = 0;     int t = 0; #ifndef  isalpha     puts("haha");     while (!(p[c] >= 'a'&&p[c] <= 'z') &&             !(p[c] >= 'A'&&p[c] <= 'Z'))     {         c--;     } #else     while (!isalpha(p[c]))         c--; #endif     for (t = c; p[t] != '\0' && p[t] != ' '; t--) {         n++;     }     return n; }  没有逻辑问题，对你的代码稍微改了一些格式。 请问： cal函数中的#ifndef不是用来预编译头的吗？在这里有什么用吗？ include把双引号换成尖括号有什么不同吗？[/quote] #ifndef这个是预编译，这里的使用和头文件里的使用效果是一样的； 一般函数库的头文件或者系统的头文件都用<>括起来，自定义的头文件用""括起来。[/quote] 搜嘎，但是我改了一下，还是运行错误=_=

user: user-2
content: 引用 4 楼 innocent_sheld 的回复:[quote=引用 2 楼 cfjtaishan 的回复:]  #include "stdio.h" #include "string.h" #include "stdlib.h" /* #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> */ int cal(char p[128]); int c = 0;  int main() {     char string_name[128], temp;     int the_count = 0;      printf("Please input the string:");     do     {         temp = getchar();         string_name[c] = temp;         c++;     } while (temp != '\n');      the_count = cal(string_name);     printf("the length of the last word is %d\n", the_count);     //system("pause");      return 0; } int cal(char p[128]) {     int n = 0;     int t = 0; #ifndef  isalpha     puts("haha");     while (!(p[c] >= 'a'&&p[c] <= 'z') &&             !(p[c] >= 'A'&&p[c] <= 'Z'))     {         c--;     } #else     while (!isalpha(p[c]))         c--; #endif     for (t = c; p[t] != '\0' && p[t] != ' '; t--) {         n++;     }     return n; }  没有逻辑问题，对你的代码稍微改了一些格式。 请问： cal函数中的#ifndef不是用来预编译头的吗？在这里有什么用吗？ include把双引号换成尖括号有什么不同吗？[/quote] #ifndef这个是预编译，这里的使用和头文件里的使用效果是一样的； 一般函数库的头文件或者系统的头文件都用<>括起来，自定义的头文件用""括起来。

user: user-0
content: 引用 1 楼 jianwen0529 的回复:system("pause"); 这个命令只在windows有效吧，去掉试试 去掉这个之后就显示不了最后的printf语句了==

user: user-0
content: 引用 2 楼 cfjtaishan 的回复: #include "stdio.h" #include "string.h" #include "stdlib.h" /* #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> */ int cal(char p[128]); int c = 0;  int main() {     char string_name[128], temp;     int the_count = 0;      printf("Please input the string:");     do     {         temp = getchar();         string_name[c] = temp;         c++;     } while (temp != '\n');      the_count = cal(string_name);     printf("the length of the last word is %d\n", the_count);     //system("pause");      return 0; } int cal(char p[128]) {     int n = 0;     int t = 0; #ifndef  isalpha     puts("haha");     while (!(p[c] >= 'a'&&p[c] <= 'z') &&             !(p[c] >= 'A'&&p[c] <= 'Z'))     {         c--;     } #else     while (!isalpha(p[c]))         c--; #endif     for (t = c; p[t] != '\0' && p[t] != ' '; t--) {         n++;     }     return n; }  没有逻辑问题，对你的代码稍微改了一些格式。 请问： cal函数中的#ifndef不是用来预编译头的吗？在这里有什么用吗？ include把双引号换成尖括号有什么不同吗？