标题:新手帖:题目要求将小写字母转化为大写字母。但是要控制每个字符串长度不大 ...
只看楼主
hu20845319
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-10-25
结帖率:100%
已结贴  问题点数:10 回复次数:8 
新手帖:题目要求将小写字母转化为大写字母。但是要控制每个字符串长度不大于80,要怎样做,请高手指点哈。
提交到OJ上他老报错,请高手指点哈,谢谢了。
#include"string.h"
#include"stdio.h"
void main()
{
   char s[80][80];
   int i=0,j,count;
   while(1)
   {
       gets(s[i]);
      if(s[i][0]=='#'&&s[i][1]=='\0')
           break;
       i++;
   }
   count=i+1;
   for(i=0;i<count;i++)
   {   
       for(j=0;j<80;j++)
       {
          if(s[i][j]=='#'&&s[i][j+1]=='\0')
             break;
         if(s[i][j]>='a'&&s[i][j]<='z')
          {
          s[i][j]=s[i][j]-32;
          }
        
         
       }
   }
   for(i=0;i<count;i++)
   {
       puts(s[i]);
   }
}
搜索更多相关主题的帖子: 字母 include 字符串 count 
2011-12-19 16:53
lyl59840
Rank: 2
等 级:论坛游民
帖 子:25
专家分:22
注 册:2011-12-14
得分:0 
while(1)
   {
       gets(s[i]);
      if(s[i][0]=='#'&&s[i][1]=='\0')
           break;
       i++;
   }

这个循环是个死循环  程序一直在这里打转,跳不出去。
建议

int i,n;
printf("您要输入几个字符串?");
scanf("%d",&n);
for(i=0;i<n;i++)
{
    gets(s[i]);
}
然后再用  strupr这个函数转换   ascii码也可以,自己看着做做把。
2011-12-20 00:15
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:6 
楼上没玩过ACM,而楼主对ACM是刚开始玩,还不了解游戏的规则。

以后发这类题目最好附上题目的地址,方便别人去实际的调试。

根据你的描述,重新替你总结一下。
控制每个字符串长度不大于80,这话是你改的吧,原话应该是说输入的每个字符串长度不大于80。这是题目的格式提示,不是要求,它是在告诉你该用多大的缓存。
另外题目只告诉你每个字符串的长度不大于80,但没说字符串的数量不大于80。所以你的char s[80][80]存在很大的隐患。
看起来,输入是每行一个字符串,以#结束。

如果我理解的没错,下面这几行代码就可以AC了。建议多了解一下标准库提供的功能函数。
程序代码:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
    char c[128], *p;
    while(gets(c), strcmp(c, "#"))
    {
        for(p = c; *p; putchar(toupper(*p++)));
        putchar('\n');
    }
    return 0;
}

重剑无锋,大巧不工
2011-12-20 08:03
lyl59840
Rank: 2
等 级:论坛游民
帖 子:25
专家分:22
注 册:2011-12-14
得分:0 
我也是新手,谢谢。

另外求解释  那个 if(s[i][0]=='#'&&s[i][1]=='\0')
谢谢。
2011-12-20 12:13
hu20845319
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-10-25
得分:0 
好的    if(s[i][0]=='#'&&s[i][1]=='\0')就是当‘#’作为一个字符串被输入时,跳出while循环.
多谢了哈。

世上没有不可饶恕的错误,只要你有一颗改过的诚心~~
2011-12-20 13:19
hu20845319
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-10-25
得分:0 
不好意思,由于是学校内部的OJ,不对外开放,我把原题写一哈。
原题是:描述:输入多个以'#'的字符串(每个字符串占一行),要求将其中小写字母转换为大写字母(其他字符不处理),并将每个字符串输出(包括'#'号)。
输入:多组数据,每组输入数据是一个以‘#’结尾的字符串(长度不大于80),该字符串占一行。当字符串只有一个'#'没有其他字符时表示输入结束。
输出:对于输入的每个字符串,在一行上输出转换后的字符串,然后换行。表示结束的字符串不处理。
  
回3楼:“输入的每个字符串长度不大于80。这是题目的格式提示,不是要求,它是在告诉你该用多大的缓存。”
那么对于大于80的字符串,应作何处理呢?按我原来写的,当字符串长度大于80后,他会自动跳入下一行,以下一行的‘#’作为结束标志。那么正确的应该是仅仅对不大于80的字符做处理,还是对大于80的字符也要做处理呢?
这点仍然抱有疑问,希望能再解释下哈,谢谢了。

世上没有不可饶恕的错误,只要你有一颗改过的诚心~~
2011-12-20 14:05
hu20845319
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-10-25
得分:0 
不好意思,打漏了,
是以‘#’结尾的字符串。

世上没有不可饶恕的错误,只要你有一颗改过的诚心~~
2011-12-20 14:09
CrystalFan
Rank: 8Rank: 8
来 自:江苏南京
等 级:蝙蝠侠
帖 子:187
专家分:802
注 册:2009-7-30
得分:4 
程序代码:
#include"string.h"
#include"stdio.h"
void main()
{
   char s[80];  // 只要一个字符串就可以了
   int i=0,j,count;
   while(1)
   {
       // 输入一行
       gets(s);

      if(s[0]=='#'&&s[1]=='\0')
           break;

        //转换一行
       for(j=0;j<80;j++)
       {
          if(s[j]=='#'&&s[j+1]=='\0')
             break;
         if(s[j]>='a'&&s[j]<='z')
          {
          s[j]=s[j]-32;
          }
       }
       //输出一行
       puts(s);
   }

 /*  count=i+1;
   for(i=0;i<count;i++)
   {  
          }
   for(i=0;i<count;i++)
   {
          }*/
} 
2011-12-20 21:22
hu20845319
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-10-25
得分:0 
虽然没完全得到我想要的结果,但还是谢谢你们哈。

世上没有不可饶恕的错误,只要你有一颗改过的诚心~~
2011-12-22 13:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-358144-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029548 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved