鱼C论坛

 找回密码
 立即注册
查看: 1369|回复: 4

[已解决]C语言简单字符串题——诡异的输出

[复制链接]
发表于 2021-1-11 15:26:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 风中凉意 于 2021-1-11 15:31 编辑

题目描述
输入一行大写字母,输出每个字母(在字母表里)随后的字母,如果是Z则变为A

输入
输入文件的第1行为一个整数n,表示接下来字符串的个数。接下来的n行中,每行为一个字符串,包含大写字母字符(最多50个)。

输出
对文件中的每个字符串,首先输出字符串的序号,如样例输出中所示,然后输出对应字符串:对输入字符串中的每个字符,用字母表中随后的字母替换,如对
字母Z,用A替换。
在每个测试数据的输出之后,输出一个空行。

样例输入
2
HAL
SWERC
样例输出
String #1
IBM

String #2
TXFSD

题目是很基础的凯撒密码类问题,但是本人的代码的输出却出现了很诡异的问题,本人代码如下:
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4.     char x[51];
  5.         int n,i,j,k,l;
  6.         scanf("%d",&n);
  7.         for(i=1;i<=n;i++){
  8.                 if(i!=n){
  9.                         for(k=0;(x[k]=getchar())!='\n';k++);
  10.                             x[k]='\0';
  11.                 }
  12.                 else{
  13.                             for(k=0;(x[k]=getchar())!=EOF;k++);
  14.                             x[k]='\0';
  15.                 }
  16.                 l=strlen(x);
  17.                 for(j=0;j<l;j++){
  18.                         if(x[j]>='A'&&x[j]<'Z')x[j]+=1;
  19.                         if(x[j]=='Z')x[j]='A';
  20.                 }
  21.                 printf("String #%d\n",i);
  22.                 printf("%s\n\n",x);
  23.         }
  24.         return 0;
  25. }
复制代码

而最终的输出却是:
  1. String #1


  2. String #2
  3. IBM
  4. TXFSD


复制代码

输出中的字符串竟然都下移到了最后?!!
后来我尝试把输出合并成一句,然而毫无作用。。。
  1. printf("String #%d\n%s\n\n",i,x);
复制代码

后来尝试用putchar(),puts()输出都不行,唯一一次成功没有下移是输入采用scanf进行输入,但是OJ的测试数据中存在一行字符数据中有空格的情况,因此不能全部顺利通过,用gets()函数的话,也会出现下移的情况,另外OJ里的测试数据末尾没有‘\n’,用gets()可能会导致栈溢出,故用getchar来得到输入。希望有大佬能解释一下为什么会出现%s的输出统一移到末尾这种诡异的输出情况。
最佳答案
2021-1-11 15:50:34
本帖最后由 sunrise085 于 2021-1-11 15:53 编辑

for循环外的scanf读取一个%d之后会在缓冲区遗留一个回车字符,需要清除掉
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4.     char x[51];
  5.     int n,i,j,k,l;
  6.     scanf("%d",&n);
  7.     getchar();//清除前一个scanf遗留在缓冲区的回车字符
  8.     for(i=1;i<=n;i++){
  9.         
  10.         for(k=0;(x[k]=getchar())!='\n';k++);//都是以回车作为结束,不用区分是不是最后一个
  11.             x[k]='\0';

  12.         l=strlen(x);
  13.         for(j=0;j<l;j++){
  14.             if(x[j]>='A'&&x[j]<'Z')x[j]+=1;
  15.             else if(x[j]=='Z')x[j]='A';//不能写两个if,这一行必须在else中,因为输入有Y的话,用你的程序就会被变成A
  16.         }
  17.         printf("String #%d\n",i);
  18.         printf("%s\n\n",x);
  19.     }
  20.     return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-11 15:50:11 | 显示全部楼层
py版本:
  1. num=int(input("请输入待测试数据条数:"))
  2. lst=[]
  3. for x in range(num):
  4.    lst.append(input("输入大写字符串(由A---Z组成):"))
  5. for cs in lst:
  6.    s=""
  7.    for c in cs:
  8.       z=chr(ord(c)+1)
  9.       if c=="Z":
  10.          z="A"
  11.       s+=z
  12.    print(s)   
  13. '''
  14. D:\wp>py wp\wp1.py
  15. 请输入待测试数据条数:5
  16. 输入大写字符串(由A---Z组成):ASLJDFQZN
  17. 输入大写字符串(由A---Z组成):QUORUOA
  18. 输入大写字符串(由A---Z组成):LADFAAQ
  19. 输入大写字符串(由A---Z组成):ZZZZZEJJH
  20. 输入大写字符串(由A---Z组成):SLJKDLSA
  21. BTMKEGRAO
  22. RVPSVPB
  23. MBEGBBR
  24. AAAAAFKKI
  25. TMKLEMTB
  26. '''   
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-11 15:50:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2021-1-11 15:53 编辑

for循环外的scanf读取一个%d之后会在缓冲区遗留一个回车字符,需要清除掉
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4.     char x[51];
  5.     int n,i,j,k,l;
  6.     scanf("%d",&n);
  7.     getchar();//清除前一个scanf遗留在缓冲区的回车字符
  8.     for(i=1;i<=n;i++){
  9.         
  10.         for(k=0;(x[k]=getchar())!='\n';k++);//都是以回车作为结束,不用区分是不是最后一个
  11.             x[k]='\0';

  12.         l=strlen(x);
  13.         for(j=0;j<l;j++){
  14.             if(x[j]>='A'&&x[j]<'Z')x[j]+=1;
  15.             else if(x[j]=='Z')x[j]='A';//不能写两个if,这一行必须在else中,因为输入有Y的话,用你的程序就会被变成A
  16.         }
  17.         printf("String #%d\n",i);
  18.         printf("%s\n\n",x);
  19.     }
  20.     return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-1-11 16:03:19 | 显示全部楼层
sunrise085 发表于 2021-1-11 15:50
for循环外的scanf读取一个%d之后会在缓冲区遗留一个回车字符,需要清除掉

谢谢大佬,不过想说一下10行那里还是得用我原来的代码,因为我学校OJ里的最后一行末尾是不加回车的,若用你的会导致程序一直运行导致栈溢出。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-11 16:10:25 | 显示全部楼层
风中凉意 发表于 2021-1-11 16:03
谢谢大佬,不过想说一下10行那里还是得用我原来的代码,因为我学校OJ里的最后一行末尾是不加回车的,若用 ...

哦,这样也好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-2 17:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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