风中凉意 发表于 2021-1-11 15:26:27

C语言简单字符串题——诡异的输出

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

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

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

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

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

String #2
TXFSD

题目是很基础的凯撒密码类问题,但是本人的代码的输出却出现了很诡异的问题,本人代码如下:
#include <stdio.h>
#include <string.h>
int main(){
    char x;
        int n,i,j,k,l;
        scanf("%d",&n);
        for(i=1;i<=n;i++){
                if(i!=n){
                        for(k=0;(x=getchar())!='\n';k++);
                            x='\0';
              }
              else{
                            for(k=0;(x=getchar())!=EOF;k++);
                            x='\0';
              }
                l=strlen(x);
                for(j=0;j<l;j++){
                        if(x>='A'&&x<'Z')x+=1;
                        if(x=='Z')x='A';
                }
                printf("String #%d\n",i);
                printf("%s\n\n",x);
        }
        return 0;
}
而最终的输出却是:
String #1


String #2
IBM
TXFSD



输出中的字符串竟然都下移到了最后?!!
后来我尝试把输出合并成一句,然而毫无作用。。。
printf("String #%d\n%s\n\n",i,x);
后来尝试用putchar(),puts()输出都不行,唯一一次成功没有下移是输入采用scanf进行输入,但是OJ的测试数据中存在一行字符数据中有空格的情况,因此不能全部顺利通过,用gets()函数的话,也会出现下移的情况,另外OJ里的测试数据末尾没有‘\n’,用gets()可能会导致栈溢出,故用getchar来得到输入。希望有大佬能解释一下为什么会出现%s的输出统一移到末尾这种诡异的输出情况。{:7_119:}

wp231957 发表于 2021-1-11 15:50:11

py版本:
num=int(input("请输入待测试数据条数:"))
lst=[]
for x in range(num):
   lst.append(input("输入大写字符串(由A---Z组成):"))
for cs in lst:
   s=""
   for c in cs:
      z=chr(ord(c)+1)
      if c=="Z":
         z="A"
      s+=z
   print(s)   
'''
D:\wp>py wp\wp1.py
请输入待测试数据条数:5
输入大写字符串(由A---Z组成):ASLJDFQZN
输入大写字符串(由A---Z组成):QUORUOA
输入大写字符串(由A---Z组成):LADFAAQ
输入大写字符串(由A---Z组成):ZZZZZEJJH
输入大写字符串(由A---Z组成):SLJKDLSA
BTMKEGRAO
RVPSVPB
MBEGBBR
AAAAAFKKI
TMKLEMTB
'''   

sunrise085 发表于 2021-1-11 15:50:34

本帖最后由 sunrise085 于 2021-1-11 15:53 编辑

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

      l=strlen(x);
      for(j=0;j<l;j++){
            if(x>='A'&&x<'Z')x+=1;
            else if(x=='Z')x='A';//不能写两个if,这一行必须在else中,因为输入有Y的话,用你的程序就会被变成A
      }
      printf("String #%d\n",i);
      printf("%s\n\n",x);
    }
    return 0;
}

风中凉意 发表于 2021-1-11 16:03:19

sunrise085 发表于 2021-1-11 15:50
for循环外的scanf读取一个%d之后会在缓冲区遗留一个回车字符,需要清除掉

谢谢大佬,不过想说一下10行那里还是得用我原来的代码,因为我学校OJ里的最后一行末尾是不加回车的,若用你的会导致程序一直运行导致栈溢出。{:7_146:}

sunrise085 发表于 2021-1-11 16:10:25

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

哦,这样也好
页: [1]
查看完整版本: C语言简单字符串题——诡异的输出