当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 菜鸡用c做的题目oj报错
帖子发表于 : 2013-05-14 13:42 

注册: 2013-05-08 15:42
帖子: 4
系统: win8
送出感谢: 0 次
接收感谢: 0 次
题目描述
去年的主人公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 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 菜鸡用c做的题目oj报错
帖子发表于 : 2013-05-14 19:17 
头像

注册: 2011-06-07 14:20
帖子: 3866
系统: Mint18
送出感谢: 17
接收感谢: 65
没有问题
用gcc和clang编译,都可以执行正常
只是警告不建议使用gets()


_________________
wiki: ubuntu 技巧


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 菜鸡用c做的题目oj报错
帖子发表于 : 2013-05-14 19:40 

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

执行是正常、但是online judge系统提示:答案错误、可能有bug或者输出格式之类的错误、
然后问下、这里如果不用gets的话、用循环%s呢还是%c呢?前者碰到名字中间空格就不输入了;后者循环停止的标志怎么定?
还是有其它好方法呢 、你看这里gets,第一行的N,都没办法被输入到N[0]了、


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 菜鸡用c做的题目oj报错
帖子发表于 : 2013-07-09 20:35 

注册: 2010-08-07 13:11
帖子: 15
送出感谢: 1
接收感谢: 0 次
不给题目地址怎么解答啊,代码也没注释


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 菜鸡用c做的题目oj报错
帖子发表于 : 2013-07-10 11:11 
头像

注册: 2010-04-23 20:40
帖子: 1950
地址: 浙江·杭州
系统: Arch Linux
送出感谢: 2
接收感谢: 31
  1. fgets 代替 gets,fgets 可以指定最多读入多少,比 gets 安全,gcc 不会给警告
  2. scanf("%d",&N); --> scanf("%d\n",&N);,读入数字后,要跳过数字这行的换行符不然 gets/fgets 会读入一个空行
  3. strcasecmp 可以忽略大小写比较字符串
  4. gets/fgets 读入的字符串最后有换行符的,puts 会在输出之后加换行符;所以如果 puts 一个 gets 进来的字符串会输出两个换行符,导致每行之间多出一个空行。用 printf("%s", string_read_in_by_fgets) 代替即可。
  5. 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[i], 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[i]);

return 0;
}
[/c]


_________________
我是 Giumo Clanjor(哆啦比猫/兰威举)
Where there is a hacker, there is art. | Develop for Developers. (C & perl5)
博客 | Clanjor Prods.
类 C 语言到 brainfuck 编译器


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译