请问我的代码为什么只有输入没有输出?

题目描述
Sine 的一个朋友疯了,最近他老爱说反话,别人说什么他就倒着说一遍,真是个奇怪的人。那他到底说了什么呢?

(他说的话不超过 1000 个字符。)

输入描述
输入一个正整数 n,表示说话的次数。下面 n 行表示说的话

输出描述
占 n 行,每行表示对应输入的反话

样例输入
2

i am speaking

ACMer

样例输出
gnikaeps ma i

reMCA

#include<stdio.h>
#include<string.h>
int main()
{
    int i,m,n;
    char st1[1000];
    char st2[1000];
   scanf("%d",&m);
    while(m--)
    { 
    gets(st1);
    scanf("%s",st1);
    i = strlen(st1);
    for (n=0;i>= 0; n++) 
    {
        st2[n] = st1[i];
        i--;
    }
    st2[n] = '\0'; 
   for(n=0;n<i;n++)
    printf("%s",st2);
    printf("\n");                       
    } 
    return 0;
 }


3个回答

#include<stdio.h>
#include<string.h>
#define N 1000
int main()
{
    int i,m,n;
    char st1[N];
    char st2[N];
    memset(st1,0x0,N);
    memset(st1,0x0,N);
    scanf("%d",&m);
    getchar();
    while(m--)
    {
        gets(st1);
        i = strlen(st1);
        for (n=0;i>0;)
            st2[n++] = st1[--i];
        st2[n] = '\0';
        printf("%s\n",st2);
    }
    return 0;
}

qtchen_1988
qtchen_1988 回复alwaysmissme: 肯定有用才打上去的,memset(st1,0x0,N);将字符串全部置‘\0'也就是初始化,getchar(); 是因为scanf输入时,输入缓冲区还有'\n'符,目的为了读掉'\n'.否则,第一次会没输入直接输出了
10 个月之前 回复
alwaysmissme
余五阳 谢谢您,可以解答memset(st1,0x0,N);的意思和 getchar();在此处用处吗
10 个月之前 回复

首先先简短的发表一下对楼主代码的看法
很明显的错误,就是输入输出在一个while中,这是一个逻辑错误,如果需要实现
样例输入
2
i am speaking
ACMer
样例输出
gnikaeps ma i
reMCA
的话,放在一起肯定是输入一个,输出一个的(当然如果需要修改在一个while中也是可以的,只需要判定为最后一次输入即可,然后全部打印)
其次再来看看代码的这里 gets(st1);scanf("%s",st1);,what?输入两次吗?其次作为程序规范,建议使用(有兴趣可以自己了解一下)char *fgets(char *s, int size, FILE *stream);
因为gets存在越界风险。而且基本上用gets会报警告,告诉你不要用(尽管大家都知道警告可以忽略)
然后是输入流的问题,scanf的输入是无法识别空格的,所以应该用gets或者fgets等
还有就是需要注意长度和元素起点是不一样的,一个是1,一个是0
例如:
123456
6位于数组第5个,但是这个数组长度是6,这里也需要注意。
当然还有就是代码规范等问题,不过也没什么
帮你看了一下,顺便修改了一下实现

#include<stdio.h>
#include<string.h>
int main()
{
    int i,m,n;
    char st1[1000];
    char st2[1000];
    scanf("%d",&m);
    getchar();//去除按下的inter键,清理缓冲
    n=0;
    while(m--)
    { 
        gets(st1);
        i = strlen(st1)-1;//数组元素从0开始,但是长度从1开始
        for(;i>=0;n++,i--) 
        {
            st2[n] = st1[i];
        }
        st2[n] = '\0';
        n++;                    
    } 
    m=i=0;
    while(m!=n)
    {
        m+=strlen(&st2[i])+1;
        printf("%s\n",&st2[i]);
        i=m;
    }
    return 0;
 }


结果
运行环境:gcc 编辑软件:sources insight

图片说明

如果是实现一个输入一个输出,楼主可以改一下,那个比这个一个更加简单,时间有点紧,注释就没怎么敲了,不接受答疑。

alwaysmissme
余五阳 谢谢您
10 个月之前 回复
#include "stdio.h"
#include "stdlib.h"

int main()
{
    int i,m,n;
    char st1[1000];
    char st2[1000];
    scanf("%d",&m);
    while(m--)
    {
    gets(st1);
    scanf("%s",st1);
    i = strlen(st1);
    i--;
    for (n=0;i>=0; n++)
    {
        st2[n] = st1[i];
        i--;
    }
    st2[n] = '\0';
    //for(n=0;n<i;n++);
    printf("%s\r\n",st2);
    //printf("\n");
    }
    return 0;
 }
alwaysmissme
余五阳 谢谢您,但是如果有空格,那么空格后的字符无法逆转
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问