求教华为的一个上机题,字符串最后一个单词的长度

小马笑哈哈 2015-08-06 09:20:08
题目如下:



我的代码:
#include <iostream>
#include <cstring>
using namespace std;
int str_length(char *s);
void main()
{
char str[139];
int num;
cout<<"please input a string:\n";
cin.getline(str,129);
num=str_length(str);
cout<<num<<endl;

}

int str_length(char *s)
{
char *ptr1,*ptr2;
int num=0,temp,leng=strlen(s);
if(s==NULL)
{
return 0;
}
else
{
ptr1=s;
ptr2=NULL;
while(ptr1!=NULL&&(ptr1-s)<leng) //若ptr1跑出s,则prt1-s大于等于leng
{
temp=0;
if(*ptr1!=' ')
{
ptr2=ptr1;
while((*ptr2)!=' '&&(ptr2-s)<leng)
{
temp++;
ptr2++;
}
ptr1=ptr2;
}
if(temp!=0)
{
num=temp; //
}
ptr1++;
}
return num;
}
}


我在vs上运行可以出来正确结果,但是显示程序测试用例未完全通过,帮忙看看我忽略了哪些情况。
...全文
3626 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
你不走吗 2016-08-21
  • 打赏
  • 举报
回复
满分是多少分,这题满分的代码发来一下,看看到底少考虑了什么
小马笑哈哈 2015-08-13
  • 打赏
  • 举报
回复
引用 18 楼 Sandrer 的回复:
[quote=引用 17 楼 april2009128 的回复:] [quote=引用 16 楼 Sandrer 的回复:] [quote=引用 14 楼 april2009128 的回复:] [quote=引用 11 楼 Sandrer 的回复:] 第 21 行代码查找第一个字母有点问题,你自己改改
没明白你的意思,麻烦你帮解释一下[/quote] 我10#中的第21行代码, 不能正确定位到第一个字母的 你要考虑一种情况就是, 这个句子中只有一个单词而没有空格 例如 "hi" 或 "hey" 或 "yo" 或 "oh" 这些[/quote] 额 那是另外一个大侠的程序,不是我的…… 依然谢谢你[/quote] 那就是我的代码, 发帖了之后我调试了才发现有错误, 所以才补发了11楼的帖子[/quote] 哈哈 下次认真点,还是很感谢你!
小马笑哈哈 2015-08-09
  • 打赏
  • 举报
回复
引用 16 楼 Sandrer 的回复:
[quote=引用 14 楼 april2009128 的回复:] [quote=引用 11 楼 Sandrer 的回复:] 第 21 行代码查找第一个字母有点问题,你自己改改
没明白你的意思,麻烦你帮解释一下[/quote] 我10#中的第21行代码, 不能正确定位到第一个字母的 你要考虑一种情况就是, 这个句子中只有一个单词而没有空格 例如 "hi" 或 "hey" 或 "yo" 或 "oh" 这些[/quote] 额 那是另外一个大侠的程序,不是我的…… 依然谢谢你
Sandrer 2015-08-09
  • 打赏
  • 举报
回复
引用 17 楼 april2009128 的回复:
[quote=引用 16 楼 Sandrer 的回复:] [quote=引用 14 楼 april2009128 的回复:] [quote=引用 11 楼 Sandrer 的回复:] 第 21 行代码查找第一个字母有点问题,你自己改改
没明白你的意思,麻烦你帮解释一下[/quote] 我10#中的第21行代码, 不能正确定位到第一个字母的 你要考虑一种情况就是, 这个句子中只有一个单词而没有空格 例如 "hi" 或 "hey" 或 "yo" 或 "oh" 这些[/quote] 额 那是另外一个大侠的程序,不是我的…… 依然谢谢你[/quote] 那就是我的代码, 发帖了之后我调试了才发现有错误, 所以才补发了11楼的帖子
Sandrer 2015-08-08
  • 打赏
  • 举报
回复
引用 14 楼 april2009128 的回复:
[quote=引用 11 楼 Sandrer 的回复:] 第 21 行代码查找第一个字母有点问题,你自己改改
没明白你的意思,麻烦你帮解释一下[/quote] 我10#中的第21行代码, 不能正确定位到第一个字母的 你要考虑一种情况就是, 这个句子中只有一个单词而没有空格 例如 "hi" 或 "hey" 或 "yo" 或 "oh" 这些
阿源是少年 2015-08-08
  • 打赏
  • 举报
回复
引用 9 楼 zilaishuichina 的回复:
[quote=引用 6 楼 april2009128 的回复:] [quote=引用 5 楼 zilaishuichina 的回复:] 我就想知道 from 1 to 100 这种应该返回几 this is a serial number ASDF_GHJK_QWER_TYUI_ZXCV 这种应该返回几 this is a password !QAZ2wsx#EDC 这种应该返回几
谢谢你的回答,是我没有考虑非法输入,但是我现在已经改正,可以输出你说的这些情况,但是还是提示测试用例未完全通过,不知道还需要考虑什么情况?我已经崩溃了[/quote] 如果在测试用例的规则中 ASDF_GHJK_QWER_TYUI_ZXCV 这玩意是算单词的呢?[/quote] 你是在自己搞自己吗,上面说的很明确,空格分割,分割出来就是一个单词,谁说非要是你所谓的词典里明明白白的单词
小马笑哈哈 2015-08-08
  • 打赏
  • 举报
回复
引用 11 楼 Sandrer 的回复:
第 21 行代码查找第一个字母有点问题,你自己改改
没明白你的意思,麻烦你帮解释一下
小马笑哈哈 2015-08-08
  • 打赏
  • 举报
回复
引用 10 楼 Sandrer 的回复:
不要想得太复杂, 题目上的知识点只是简单的"循环, 字符串" 那按正常思路, 每个单词都是以空格分开, 那么从句子尾部开始向前找空格不就得了
int findword(const char *pch)
{
    char *p = (char *)pch;
    char *t;

    if (pch[0] == '\0')
        return 0;

    // 跳到句尾
    while (*(++p));

    // 过滤字符
    while (!(*p >= 'a' && *p <= 'z') &&
           !(*p >= 'A' && *p <= 'Z'))
        p--;

    // 记住最后一个字母的位置
    t = p;

    // 向前搜索空格或句子第一个字母
    while (*p != ' ' || p == pch)
        p--;

    return t - p;
}

int main()
{
    const char *pch = "My name is Sandrer.";
    int n = findword(pch);
    printf("%s\nword size: %d\n", pch, n);
    system("pause");

    return 0;
}
是的,我才意识到没有那么麻烦,已经解决了,谢谢
小马笑哈哈 2015-08-08
  • 打赏
  • 举报
回复
引用 9 楼 zilaishuichina 的回复:
[quote=引用 6 楼 april2009128 的回复:] [quote=引用 5 楼 zilaishuichina 的回复:] 我就想知道 from 1 to 100 这种应该返回几 this is a serial number ASDF_GHJK_QWER_TYUI_ZXCV 这种应该返回几 this is a password !QAZ2wsx#EDC 这种应该返回几
谢谢你的回答,是我没有考虑非法输入,但是我现在已经改正,可以输出你说的这些情况,但是还是提示测试用例未完全通过,不知道还需要考虑什么情况?我已经崩溃了[/quote] 如果在测试用例的规则中 ASDF_GHJK_QWER_TYUI_ZXCV 这玩意是算单词的呢?[/quote] 谢谢您的回答,我已经解决了,不是程序的问题,是题目没有说清楚,华为真坑爹,不过还是谢谢您
zilaishuichina 2015-08-07
  • 打赏
  • 举报
回复
我就想知道 from 1 to 100 这种应该返回几 this is a serial number ASDF_GHJK_QWER_TYUI_ZXCV 这种应该返回几 this is a password !QAZ2wsx#EDC 这种应该返回几
mn_ytt 2015-08-07
  • 打赏
  • 举报
回复
引用 1 楼 a461874693 的回复:
int str_len(const string& str)
{
	if("" == str)
		return 0;
	istringstream is(str);
	string last;
	while (is >> last) ;
	return last.size();
}
#include <iostream>
#include <strstream>
#include <string>

using namespace std;

int str_len(const char* str)
{
	istrstream is(str);
	string last;
	while (is >> last);
	return last.size();
}

int main()
{
	char s1[100];
	cout << "input a string:";
	cin >> ws;
	cin.getline(s1,100);
	int i = str_len(s1);
	cout << i << endl;
}
Sandrer 2015-08-07
  • 打赏
  • 举报
回复
第 21 行代码查找第一个字母有点问题,你自己改改
Sandrer 2015-08-07
  • 打赏
  • 举报
回复
不要想得太复杂, 题目上的知识点只是简单的"循环, 字符串" 那按正常思路, 每个单词都是以空格分开, 那么从句子尾部开始向前找空格不就得了
int findword(const char *pch)
{
    char *p = (char *)pch;
    char *t;

    if (pch[0] == '\0')
        return 0;

    // 跳到句尾
    while (*(++p));

    // 过滤字符
    while (!(*p >= 'a' && *p <= 'z') &&
           !(*p >= 'A' && *p <= 'Z'))
        p--;

    // 记住最后一个字母的位置
    t = p;

    // 向前搜索空格或句子第一个字母
    while (*p != ' ' || p == pch)
        p--;

    return t - p;
}

int main()
{
    const char *pch = "My name is Sandrer.";
    int n = findword(pch);
    printf("%s\nword size: %d\n", pch, n);
    system("pause");

    return 0;
}
fly_dragon_fly 2015-08-07
  • 打赏
  • 举报
回复
直接用string就行了吧
int n;
string s;
while(cin>>s) n=s.size();
cout<<n<<endl;
jiqiang01234 2015-08-07
  • 打赏
  • 举报
回复

#include "boost/algorithm/string.hpp"
#include <vector>
#include <iostream>
int main()
{
	std::string s = "hello world";
	std::vector<std::string> v;

	boost::split(v, s, boost::is_any_of(" "));

	std::cout << v.back().size();
        return 0;
}

注意:没有考虑最后一个单词后面有标点符号的问题
PoorMonk丶 2015-08-07
  • 打赏
  • 举报
回复
int str_len(const string& str)
{
	if("" == str)
		return 0;
	istringstream is(str);
	string last;
	while (is >> last) ;
	return last.size();
}
zilaishuichina 2015-08-07
  • 打赏
  • 举报
回复
引用 6 楼 april2009128 的回复:
[quote=引用 5 楼 zilaishuichina 的回复:] 我就想知道 from 1 to 100 这种应该返回几 this is a serial number ASDF_GHJK_QWER_TYUI_ZXCV 这种应该返回几 this is a password !QAZ2wsx#EDC 这种应该返回几
谢谢你的回答,是我没有考虑非法输入,但是我现在已经改正,可以输出你说的这些情况,但是还是提示测试用例未完全通过,不知道还需要考虑什么情况?我已经崩溃了[/quote] 如果在测试用例的规则中 ASDF_GHJK_QWER_TYUI_ZXCV 这玩意是算单词的呢?
zilaishuichina 2015-08-07
  • 打赏
  • 举报
回复
引用 6 楼 april2009128 的回复:
[quote=引用 5 楼 zilaishuichina 的回复:] 我就想知道 from 1 to 100 这种应该返回几 this is a serial number ASDF_GHJK_QWER_TYUI_ZXCV 这种应该返回几 this is a password !QAZ2wsx#EDC 这种应该返回几
谢谢你的回答,是我没有考虑非法输入,但是我现在已经改正,可以输出你说的这些情况,但是还是提示测试用例未完全通过,不知道还需要考虑什么情况?我已经崩溃了[/quote] 其实我的意思是, 这道题目本身就没有给出一个明确的定义:怎样算一个单词,怎样不算一个单词 比如说:单词必须由26个英文字母组成(还是允许有数字),第一个字母大小写均可(还是第一个字母必须大写),后续字母不可以大写(或者是后续字母中间允许出现大写字母),还是说只有在牛津英汉大词典词库中出现的算单词,没出现的不算单词,那你可能还等弄一个词库才可以。
小马笑哈哈 2015-08-07
  • 打赏
  • 举报
回复
#include <iostream> #include <cstring> using namespace std; int str_length(char *s); void main() { char str[130]; int num,leng,i; //leng=strlen(str); //cout<<leng<<endl; cout<<"please input a string:\n"; cin.getline(str,129); leng=strlen(str); //cout<<leng<<endl; for(i=0;i<leng;i++) { if((str[i]<='z'&&str[i]>='a')||(str[i]<='Z'&&str[i]>='A')||str[i]==' ') str[i]=str[i]; else str[i]=' '; } num=str_length(str); cout<<num<<endl; } int str_length(char *s) { char *ptr1,*ptr2; int num=0,temp,leng=strlen(s); if(s==NULL) { return 0; } else { ptr1=s; ptr2=NULL; while(ptr1!=NULL&&(ptr1-s)<leng) //若ptr1跑出s,则prt1-s大于等于leng { temp=0; if(*ptr1!=' ') { ptr2=ptr1; while((*ptr2)!=' '&&(ptr2-s)<leng) { temp++; ptr2++; } ptr1=ptr2; } if(temp!=0) { num=temp; // } ptr1++; } return num; } } 这是我考虑非法输入的代码
小马笑哈哈 2015-08-07
  • 打赏
  • 举报
回复
引用 5 楼 zilaishuichina 的回复:
我就想知道 from 1 to 100 这种应该返回几 this is a serial number ASDF_GHJK_QWER_TYUI_ZXCV 这种应该返回几 this is a password !QAZ2wsx#EDC 这种应该返回几
谢谢你的回答,是我没有考虑非法输入,但是我现在已经改正,可以输出你说的这些情况,但是还是提示测试用例未完全通过,不知道还需要考虑什么情况?我已经崩溃了

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧