C语言,遇到一个奇怪的事情,分享下,一个倒序输出的问题,其他都能顺利输出,就Hello World不能正常输出

char sen[255];
int i;
printf("please input a sentence:\n");
for(i=0;i<255;i++)
{
scanf("%c",&sen[i]);
if(sen[i]=='\n')
break;
}
i = strlen(sen);
i = i -2;
for(;i>-1;i--)
{
putchar(sen[i]);
}

#include<stdio.h>
#include<math.h>
int main()
{
    char sen[255];
    int i;
    printf("please input a sentence:\n");
    for(i=0;i<255;i++)
    {
        scanf("%c",&sen[i]);
        if(sen[i]=='\n')
            break;
    }
    i--;//只需让i的值-1即可
    for(;i>-1;i--)
    {
        putchar(sen[i]);
    }
    return 0;     
}

 

追问

谢谢,但是我用strlen()函数,再让他反向输出,为什么有特殊古怪的符

追答

这是因为strlen()这个函数有问题。它得到的是字符串的长度,但是,这个长度是从字符串开始直到遇到结束符'\0'为止的长度,你的程序里面字符串sen并没有正常的结束符,所以用strlen来获得字符串长度是不准确的,此时得到的长度是大于真正的字符串长度的,所以会出现乱码

解决的方案是你在输入结束时人为的添加一个结束符

#include<stdio.h>
#include<string.h>
int main()
{
    char sen[255];
    int i;
    printf("please input a sentence:\n");
    for(i=0;i<255;i++)
    {
        scanf("%c",&sen[i]);
        if(sen[i]=='\n')
{
sen[i]='\0';//在遇到回车结束输入时,给sen[i]赋值为结束符阿
            break;
}
    }
    i=strlen(sen);
i=i-1;//此处是-1
    for(;i>-1;i--)
    {
        putchar(sen[i]);
    }
    return 0;     
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-07
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char sen[255];
int i;
printf("please input a sentence:\n");
for(i=0;i<255;i++)
{
scanf("%c",&sen[i]);
if(sen[i]=='\n')
{
sen[i]='\0';//字符串结束标志
break;

}
}
i = strlen(sen);

i = i -1;

for(;i>-1;i--)
{
putchar(sen[i]);
}
}
字符串申请了256的空间,没有占满,系统随机给后面的空间填充字符的就会乱码,给字符串加了结束符就可以解决此问题,表示后面的空间是空的了,就不乱码了,代码我给你改了。追问

那为什么其他字符串就没有这个问题呢?比如说akfjlakjfoajk askjf/.akl;ak;f hjd我随便打的,他就没与这样的问题

追答

那是编译器的问题,正是由于系统给后面空间随机分配了值,才会导致strlen测得的值不准。不知道你用的什么编译器,我用的VS2010不管输入什么,只要没有字符串结束标志,就会乱码!但是会逆序显示正确,是只是把你输入的序列逆序了,i=i-1或者i=i-2,i-3,4,5,6,7都是可以的(当然大到一定的值就不可以了,这个值就看你所用的编译器了),区别是乱码的长度不同!

第2个回答  2013-08-07

输出了啊,谁说没有

追问

是输出了,但不正常,就是这样,你看他上面有特殊的符号,为什么会这样,其他输入就没有这个问题

追答

好,我找找原因,稍等。手头正好在写别的程序,有点慢不好意思哈。

 

第一个发现,只要超过6个字符,就会有笑脸,继续找。。。

第二个发现,我加了一句显示,发现你那个 i = strlen(sen);取得的长度是错误的,如图

仔细试了一下,发现长度错的离谱,输入数字的数量改变,一直都是17,输入更多数字,变成31了,应该是strlen用错了。但是这个东西我不熟,考虑帮你改掉。

 

改好了:
去掉那个函数,输入时加个变量累计一下数量就好了

#include<stdio.h>
void main()
{
char sen[255];
    int i,k=0;
   printf("please input a sentence:\n");
    for(i=0;i<255;i++)
    {
        scanf("%c",&sen[i]);
        k++ ;
        if(sen[i]=='\n')
        break;
    }

            printf("%d\n",k);
    k = k -2;
    for(;k>-1;k--)
    {
        putchar(sen[k]);
    }

}

就这样了,如果你希望用那个函数改好,请自行查找资料哈,我就不奉陪了~

C语言,遇到一个奇怪的事情,分享下,一个倒序输出的问题,其他都能顺利...
include<stdio.h>#include<math.h>int main(){ char sen[255]; int i; printf("please input a sentence:\\n"); for(i=0;i<255;i++) { scanf("%c",&sen[i]); if(sen[i]=='\\n') break; } i--;\/\/只需让i的值-1即可 for(;i>-1;i--...

C语言 逆序输出问题
include <stdio.h>#include <stdlib.h>#include <string.h>int main(void){ char *p; char c[] = " "; char s[1024],*t,z[1024]; int flag = 1; while(gets(s)){ if(s[0] == '#'){ } else if(s[0] != '#'){ p = strtok(s,c); ...

【求助】C语言考试要求做个字符倒序输出,结果...不说了,上图。
或者还有一个更好的算法,可以节省空间。就是不用str2。在for循环里面直接把对应的两个字符交换顺序就行了。比如:hello 那么h 对 o, e 对 l。char x;for(i = 0; i <= a \/ 2; ++i){ j = a - i; x = str1[i]; str1[i] = str1[j]; str1[j] = x;}上面...

汇编语言 如何倒序输出hello world
三个方法:1、定义字符串时倒序。2、一个一个字符发,寻址时偏移量指向字符串末端,发一个字符偏移量减一。3、倒序迁移字符串到内存再发送。

C语言问题简单的很,菜鸟送分,在线等,超级高分,给我讲明白,否则关闭问题...
p--; \/\/令p指向字符串中的前一位 \/\/此时,p指向了字符串的最后一位 for( ; t > 0 ; t-- ) \/\/从后往前输出字符串的每一位,t每减小1就输出了一个字符,t=0的时候恰好每一位都已输出 { printf("%c",*p);p--; \/\/令p指向字符串的前一个字符 } printf("\\n");} ...

c语言 while(p--!=str) 什么意思
char str[]="Hello"; \/\/ 字符串里面有结束符标志是 '\\0'\/\/ 注意这里有个分号,这算是一个完整的while循环while(*p++!='\\0'); \/\/ p指向了最后一个字符O,退出while循环 while(p--!=str) \/\/此时p指向的是str最后一个字符 printf("%c",*p); \/\/ p--,即一步步指向...

我有个PASCAL语言编程问题!!急
我是个编程初学者从0起点开始自己编了个输入a和b的数值,然后输出sum的程序,运行时老不成功下面是程序program kjk;vara,b:integer;sum:integer;beginread(a,b);sum:=a+b;end.调试正常,可一运行想输入a和b,刚按一下键盘,程序就结束了。倒底是什么问题呀???另外给个pascal的教程网站好吗?? 展开 ...

相似回答