xiao__ma @ 2022-01-05 22:33:01
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
n=n%26;
char c,a[50];
c=getchar();
while((c=getchar())!='\n')
{
if((c+n)<='z')
printf("%c",c+n);
else
printf("%c",c+n-1-'z'+'a');
}
}
by DengStar @ 2022-01-05 23:24:46
这问题我必须回答。我以前也遇到过这样的问题。我在本机上测试没有任何问题,一提交就爆零,调了几个月,人都傻了。事实上问题很简单:不同系统下的回车不一样,有的是\n
,有的是\n\r
。你的代码只判了·\n
,这一行代码while((c=getchar())!='\n')
改成while((c=getchar())!='\n')&&c!='\r'
即可
by DengStar @ 2022-01-05 23:27:02
等下,好像哪里出问题了
by DengStar @ 2022-01-05 23:37:43
#include <iostream>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
n=n%26;
char c,a[50];
while(cin>>c)
{
if((c+n)<='z')printf("%c",c+n);
else printf("%c",c+n-1-'z'+'a');
}
}
用cin读入可以过滤掉空白字符
by DengStar @ 2022-01-05 23:38:27
尽量不要用char
读入,用字符串
by DengStar @ 2022-01-05 23:39:31
还有你应当return 0
by _Imaginary_ @ 2022-01-06 06:47:03
@RDFZdsd lz好像是c不是c++
by DengStar @ 2022-01-06 11:43:50
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
n=n%26;
char c,a[50];
getchar();
while(scanf("%c",&c)!=EOF)
{
if(c=='\r'||c=='\n') continue;
if((c+n)<='z') printf("%c",c+n);
else printf("%c",c+n-1-'z'+'a');
}
return 0;
}
c的版本
by DengStar @ 2022-01-06 11:46:18
原来不对是因为输入根本就没有回车,你自己测没问题是因为你自己打了一个回车……所以必须要用EOF
判断。但是这一行if(c=='\r'||c=='\n') continue;
不能去掉,我也不知道为什么。
by DengStar @ 2022-01-06 11:52:40
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
n=n%26;
char c,a[50];
getchar();getchar();
while(scanf("%c",&c)!=EOF)
{
// if(c=='\r'||c=='\n') continue;
if((c+n)<='z') printf("%c",c+n);
else printf("%c",c+n-1-'z'+'a');
}
return 0;
}
好吧,现在我知道原因了,因为第一行的n后面同样有2个字符\n\r
,因此getchar()要用两次……这份代码在本机的Windows系统上是错的,但是交上去是对的,因为评测机是Linux系统,两个系统的回车不一样。所以说尽量少用char
读入,如果必须要用char
读入的话最好在Linux的虚拟机上测一下
by xiao__ma @ 2022-07-20 15:03:09
@RDFZdsd 谢谢巨巨!