吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5076|回复: 18
收起左侧

[C&C++ 转载] 最后一个单词的长度,自己能运行,过不了OJ。

[复制链接]
chinalixs 发表于 2015-2-17 15:26
本帖最后由 chinalixs 于 2015-2-17 17:26 编辑

111.png 题目:
最后一个单词的长度

例如:

   s = “hello World”, 那么返回的结果是5

格式:

   第一行输入字符串s,然后输出s中最后一个单词的长度。

样例输入
Today is a nice day

样例输出
3


[C] 纯文本查看 复制代码
#include <stdio.h>
int main()
{
	char s[1000];//想不出好方法只能用一个1000的数组,求指教。 
	gets(s);
	int i=0,m=0;//m用于计数
	
	//如果是\0停止,如果是‘空格’,m从0开始计数。 
	for(i=0;i<100;i++)
	{
		if(s[i]=='\0') 
		break;
		m++;
		if(s[i]==' ') m=0;
		
	}
	
	printf("%d",m);

	return 0;
}
[i][i]



免费评分

参与人数 1热心值 +1 收起 理由
homer + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

醉空流澈 发表于 2015-2-18 18:10
本帖最后由 醉空流澈 于 2015-2-18 18:19 编辑

你的代码确实错在字符串末有空格的情况下。
下面这个是我自己的,个人觉得容易理解,但有点乱好像…⊙﹏⊙
[C] 纯文本查看 复制代码
#include <stdio.h>
int main()
{
	char s[10000];
	gets(s);
	int len=0,i=0;
	while(s[i]!='\0')
	{
		if(s[i]!=' ')
		{
			int temp=0;
			while(s[i]!='\0'&&s[i]!=' ')
			{
				++i;
				++temp;
			}
			len=temp;
		}
		else
			++i;
	}
	printf("%d",len);
	return 0;
}


下面这个是在计蒜客上别人贴出来的,把他的using namespace std;删了就正确了,比较简单:
[C] 纯文本查看 复制代码
#include <stdio.h>
int main()
{
	char s[10000]; 
    gets(s);
	int j=0, k=0;
	for(int i=0; s[i]!='\0';i++)
	{
		if(s[i]==' ')
		{
			if(j!=0)
				k=j;
			j=0;
        }
        else
			j++;
    }
	printf ("%d\n",j==0?k:j);
	return 0;
}


下面的是C++的,更方便,也更容易理解:
[C] 纯文本查看 复制代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string line;
	getline(cin,line);
	int len=0;
	for(int i=line.length()-1;i>=0;--i)
	{
		if(line[i]==' ')
		{
			if(len!=0)
				break;
		}
		else
			++len;
	}
	cout<<len<<endl;
	return 0;
}

免费评分

参与人数 1热心值 +1 收起 理由
chinalixs + 1 我很赞同!

查看全部评分

yes2 发表于 2015-2-28 13:03
本帖最后由 yes2 于 2015-2-28 13:19 编辑

不喜欢计蒜客这一点。出错的时候用于测试代码的输入输入是什么根本不给,这样我根本不知道哪里错了。确实是可以参考别人的代码,但是问题是别人的思路不一定和我的一样,我还是不知道我的错在哪里。即使思路一样,看了别人的代码我还是不知道错在哪!!如何进步?不知道错在哪
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	char sz[1024];
	int nLen = 0;
	while (1)
	{
		sz[0] = getc(stdin);
		if (sz[0] == ' ' || sz[0] == '\t')
		{
			continue;
		}
		if (sz[0] == '\n' || sz[0] == '\r')
		{
			break;
		}
		ungetc(sz[0] , stdin);

		scanf("%s" , &sz[0]);
		nLen = strlen(sz);
	}
	printf("%d" , nLen);

	return 0;
}

 楼主| chinalixs 发表于 2015-2-17 15:26
flyang123 发表于 2015-2-17 15:35
我啥都不懂 ,我是来支持的
homer 发表于 2015-2-17 15:40
=_=..你这个算法..如果遇到单词后面有一个‘ ’怎么办?

免费评分

参与人数 1热心值 +1 收起 理由
chinalixs + 1 我很赞同!

查看全部评分

 楼主| chinalixs 发表于 2015-2-17 17:13
homer 发表于 2015-2-17 15:40
=_=..你这个算法..如果遇到单词后面有一个‘ ’怎么办?

出题的不会那么做吧。。。。现在问题是,我出错在哪!
homer 发表于 2015-2-17 17:36
chinalixs 发表于 2015-2-17 17:13
出题的不会那么做吧。。。。现在问题是,我出错在哪!

错误就是这个
吾爱T阿杰 发表于 2015-2-17 17:47 来自手机
看不懂。。。。。
 楼主| chinalixs 发表于 2015-2-17 19:41
本帖最后由 chinalixs 于 2015-2-17 19:44 编辑

改成这样,OJ提示我程序运行错误:在你的程序的执行过程中,可能出现了非法的文件访问、堆栈溢出、非法访问了内存单元、数组越界、在计算中把0作为除数等导致程序异常结束的情况。
我在编译器上没问题。。。求教!难道是s[1000]太小了。
[C] 纯文本查看 复制代码
#include <stdio.h>
int main()
{
        char s[1000];//想不出好方法只能用一个1000的数组,求指教。 
        gets(s);
        int i=0,m=0;//m用于计数
        
        //如果是\0停止,如果是‘空格’,m从0开始计数。 
        for(i=0;i<1000;i++)
        {
                if(s[i]=='\0') 
                break;
                m++;
                if(s[i]==' '&&s[i+1]!='\0') m=0;//要注意如果最后一个单词最后一位是’ ‘! 
        if(s[i]==' '&&s[i+1]=='\0') m--;
                
        }
        
        printf("%d",m);

        return 0;
}
homer 发表于 2015-2-17 19:55
chinalixs 发表于 2015-2-17 19:41
改成这样,OJ提示我程序运行错误:在你的程序的执行过程中,可能出现了非法的文件访问、堆栈溢出、非法访 ...

1000的确太小了....简单的话就改成2w吧,高级一点就用指针存储字符串
 楼主| chinalixs 发表于 2015-2-17 20:35
homer 发表于 2015-2-17 19:55
1000的确太小了....简单的话就改成2w吧,高级一点就用指针存储字符串

好像错误出在,如果最后有好多空格,我这个就输出负数!想了几个办法都解决不了。。。亲~你怎么好像挂QQ一样啊!神一样的存在着。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-2 22:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表