菜鸡用c做的题目oj报错

C、C++和Java语言
回复
polarbearUL
帖子: 4
注册时间: 2013-05-08 15:42
系统: win8
送出感谢: 0
接收感谢: 0

菜鸡用c做的题目oj报错

#1

帖子 polarbearUL » 2013-05-14 13:42

题目描述
去年的主人公Weijie 要离开大学了,于是大家决定帮他举行欢送宴会。
BobWu 很想知道究竟有多少人参加了Weijie 的欢送宴会,于是他弄来了客人名单。名单有N 行,但是其中有很多重复的名字,比方BOBWU 和BobWu 其实指的都是同一个人,但是名单上的名字却区分大小写重复出现了。
BobWu 想知道去除重复的名字以后究竟有哪些客人。

输入
输入的第一行为整数N,接下来有N 行,每行表示一个客人的名字。名单上只会出现英文字母和空格。
1≤N≤200

输出
输出的第一行为整数X,X 是客人的数目,接下来的X 行每行输出一个名字,按照名单上第一次出现这个名字的样式输出。

样例输入
6
WEIJIE
BOBWU
BobWu
HAPPY YUAN
Happy yuan
Anonymous

样例输出
4
WEIJIE
BOBWU
HAPPY YUAN
Anonymous

以下我这个大一大菜鸡做的:

代码: 全选

#include<stdio.h>
#include<string.h>
int main()
{
	static char X[201][20];
	int N,k,x=1,i,j,b,l;
	scanf("%d",&N);
	for(i=0;i<=N;i++)
		gets(X[i]);
	for(i=2;i<=N;i++)
	{
		if(N<2)
			break;
		b=0;
		for(j=1;j<=x;j++)
		{
			l=strlen(X[i])>strlen(X[j])?strlen(X[i]):strlen(X[j]);
			for(k=0;k<l;k++)
			{
				if(X[i][k]==X[j][k] || X[i][k]==X[j][k]+32 || X[i][k]+32==X[j][k])
				{
					b=1;
					continue;
				}
				else
				{
					b=0;
					break;
				}
			
			}
			if(b)
				break;
		}
		if(b==0)
			strcpy(X[++x],X[i]);
	}
	printf("%d\n",x);
	for(i=1;i<=x;i++)
		puts(X[i]);
	return 0;
}
oj系统报错、但是我真的找不出来啦、求各位大大指教! :em01
上次由 polarbearUL 在 2013-05-14 19:35,总共编辑 1 次。
头像
b33e
论坛版主
帖子: 3862
注册时间: 2011-06-07 14:20
系统: Mint18
送出感谢: 16 次
接收感谢: 62 次

Re: 菜鸡用c做的题目oj报错

#2

帖子 b33e » 2013-05-14 19:17

没有问题
用gcc和clang编译,都可以执行正常
只是警告不建议使用gets()
polarbearUL
帖子: 4
注册时间: 2013-05-08 15:42
系统: win8
送出感谢: 0
接收感谢: 0

Re: 菜鸡用c做的题目oj报错

#3

帖子 polarbearUL » 2013-05-14 19:40

b33e 写了:没有问题
用gcc和clang编译,都可以执行正常
只是警告不建议使用gets()
执行是正常、但是online judge系统提示:答案错误、可能有bug或者输出格式之类的错误、
然后问下、这里如果不用gets的话、用循环%s呢还是%c呢?前者碰到名字中间空格就不输入了;后者循环停止的标志怎么定?
还是有其它好方法呢 、你看这里gets,第一行的N,都没办法被输入到N[0]了、
oldtype
帖子: 15
注册时间: 2010-08-07 13:11
送出感谢: 1 次
接收感谢: 0

Re: 菜鸡用c做的题目oj报错

#4

帖子 oldtype » 2013-07-09 20:35

不给题目地址怎么解答啊,代码也没注释
头像
cjxgm
帖子: 1950
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
送出感谢: 1 次
接收感谢: 30 次
联系:

Re: 菜鸡用c做的题目oj报错

#5

帖子 cjxgm » 2013-07-10 11:11

  • fgets 代替 gets,fgets 可以指定最多读入多少,比 gets 安全,gcc 不会给警告
  • scanf("%d",&N); --> scanf("%d\n",&N);,读入数字后,要跳过数字这行的换行符不然 gets/fgets 会读入一个空行
  • strcasecmp 可以忽略大小写比较字符串
  • gets/fgets 读入的字符串最后有换行符的,puts 会在输出之后加换行符;所以如果 puts 一个 gets 进来的字符串会输出两个换行符,导致每行之间多出一个空行。用 printf("%s", string_read_in_by_fgets) 代替即可。
  • CODING STYLE: 尽量避免一个字母的变量名,除了计次循环的变量 i, j, k 之类的
我的版本:(点击“展开”)
[c]
#include <stdio.h>
#include <string.h>

#define NAME_LEN 128

static char names[200][NAME_LEN];
static char name[NAME_LEN];
static int nname; // number of names

int main()
{
int ninput; // number of inputs
int i;

scanf("%d\n", &ninput);

while (ninput--) {
fgets(name, NAME_LEN-1, stdin);

// check if name is in list
for (i=0; i<nname; i++)
if (!strcasecmp(names, name))
goto _name_in_list;

// name not in list
strcpy(names[nname++], name);

_name_in_list:
continue; // stop gcc shouting
}

printf("%d\n", nname);
for (i=0; i<nname; i++)
printf("%s", names);

return 0;
}
[/c]
回复

回到 “C/C++/Java”