| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1922 人关注过本帖
标题:逆向输出,结果是乱码,求助
只看楼主 加入收藏
st518
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2014-3-11
结帖率:100%
收藏
已结贴  问题点数:19 回复次数:8 
逆向输出,结果是乱码,求助
此贴是明解C语言入门篇P219的9-7
程序代码:
#include <stdio.h>

 
// 倒序显示字符串(不换行)
void put_string(const char str[])
{
     unsigned i =99;    //为字符串str创建足够长度 
     while (!str[i]) i--;     //找到字符串str输入的最后一位; 
   
     for (;i>=0;i--)        //字符串str最后一位开始显示到第一位; 
         {putchar(str[i]);}
} 

 
int main(void)
{
    char str[100];
    
    printf("请输入字符串:");
    scanf("%s", str);
    
    put_string(str);
    putchar('\n');
    
    return (0);    
}


问题出在哪呢
搜索更多相关主题的帖子: 输出 结果 乱码 字符串 str 
2018-07-28 16:56
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:19 
void put_string(const char str[])
{
     int i;
     for (i=0; str[i]; ++i);
     for (--i; i>=0; --i)
        putchar(str[i]);
}
2018-07-28 19:09
st518
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2014-3-11
收藏
得分:0 
回复 2楼 吹水佬
这个的思想是取得str的位数再逆向输出

其实我的困惑在于开始出来的一堆乱码。有个大神提到了memset。
2018-07-28 20:01
no1xijin
Rank: 9Rank: 9Rank: 9
来 自:江西
等 级:贵宾
威 望:20
帖 子:211
专家分:1207
注 册:2015-7-8
收藏
得分:0 
你的问题在于
1.将i定义为无符号整数( unsigned i =99;    //为字符串str创建足够长度 )即表示i一直大于等于0,而你的输出判断又是当i为负时结束输出(for (;i>=0;i--)        //字符串str最后一位开始显示到第一位; )自然程序将一直输出,不会结束。将 unsigned 改为 int即可。
2.while (!str[i]) i--;     //找到字符串str输入的最后一位;
  这个判断逻辑有问题,str[]数组虽然你没有放数据进去,但是并不表示它没有数据,实际上它内部有数据,你的乱码就表示有数据,因此这个循环,根本进不去。
将while内条件判断去掉 ! ,同时将i设为 int i=0, while内将 i-- 改为 i++; 从首位找 字符串str的最后一位。
以下是修改后的代码
程序代码:
#include <stdio.h>

// 倒序显示字符串(不换行)
void put_string(const char str[])
{
    int i =0;    //为字符串str创建足够长度 
    while (str[i]) i++;     //找到字符串str输入的最后一位; 
    
    i=i-1; // 末尾的结束符不输出
    
    for (;i>=0;i--)        //字符串str最后一位开始显示到第一位; 
    {putchar(str[i]);}
} 

int main(void)
{
    char str[100];
    
    printf("请输入字符串:");
    scanf("%s", str);
    
    put_string(str);
    putchar('\n');
    
    return (0);    
}


126邮箱联系方式:no1xijin@126. com
2018-07-28 20:27
st518
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2014-3-11
收藏
得分:0 
以下是引用no1xijin在2018-7-28 20:27:11的发言:

你的问题在于
1.将i定义为无符号整数( unsigned i =99;    //为字符串str创建足够长度 )即表示i一直大于等于0,而你的输出判断又是当i为负时结束输出(for (;i>=0;i--)        //字符串str最后一位开始显示到第一位; )自然程序将一直输出,不会结束。将 unsigned 改为 int即可。
2.while (!str) i--;     //找到字符串str输入的最后一位;
  这个判断逻辑有问题,str[]数组虽然你没有放数据进去,但是并不表示它没有数据,实际上它内部有数据,你的乱码就表示有数据,因此这个循环,根本进不去。
将while内条件判断去掉 ! ,同时将i设为 int i=0, while内将 i-- 改为 i++; 从首位找 字符串str的最后一位。
以下是修改后的代码
#include <stdio.h>

// 倒序显示字符串(不换行)
void put_string(const char str[])
{
    int i =0;    //为字符串str创建足够长度
    while (str) i++;     //找到字符串str输入的最后一位;
   
    i=i-1; // 末尾的结束符不输出
   
    for (;i>=0;i--)        //字符串str最后一位开始显示到第一位;
    {putchar(str);}
}

int main(void)
{
    char str[100];
   
    printf("请输入字符串:");
    scanf("%s", str);
   
    put_string(str);
    putchar('\n');
   
    return (0);   
}


谢谢指点。
请您看看我的理解对不对:
主程序    char str[100];比如说输入9个字符后加上null,前10个是我们输入的字符(包括null),但是后面90个仍然有值。是不是这样啊?
我以前的理解是输入完毕后加上null,后面的就全是null了。
2018-07-29 09:56
no1xijin
Rank: 9Rank: 9Rank: 9
来 自:江西
等 级:贵宾
威 望:20
帖 子:211
专家分:1207
注 册:2015-7-8
收藏
得分:0 
回复 5楼 st518
主程序    char str[100];比如说输入9个字符后加上null,前10个是我们输入的字符(包括null),但是后面90个仍然有值。是不是这样啊?
我以前的理解是输入完毕后加上null,后面的就全是null了。
你的两个理解大致都没有问题。
首先,因为你没有初始化数组str[100]的值,因此它内部可能有值。
其次,你以前的理解(以前的理解是输入完毕后加上null,后面的就全是null了),有个前提条件,就是你初始化数组str[100]为NULLL
为了说明你以前理解的问题所在,我在你的源代码上添加了初始化数组str[100]为NULLL,T同时将 unsigned i =99;    //为字符串str创建足够长度   改为   int i =99;    //为字符串str创建足够长度
这样就没有改变你的思维,并且你的代码也能正常运行。具体见下列代码:

程序代码:
#include <stdio.h>

 
// 倒序显示字符串(不换行)
void put_string(const char str[])
{
     int i =99;    //为字符串str创建足够长度 
     while (!str[i]) i--;     //找到字符串str输入的最后一位; 
   
     for (;i>=0;i--)        //字符串str最后一位开始显示到第一位; 
         {putchar(str[i]);}
} 

 
int main(void)
{
    char str[100]={0};  // 初始化后数组内的内容就全为NULL了
    
    printf("请输入字符串:");
    scanf("%s", str);
    
    put_string(str);
    putchar('\n');
    
    return (0);    
}



126邮箱联系方式:no1xijin@126. com
2018-07-29 21:17
st518
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2014-3-11
收藏
得分:0 
以下是引用no1xijin在2018-7-29 21:17:55的发言:

主程序    char str[100];比如说输入9个字符后加上null,前10个是我们输入的字符(包括null),但是后面90个仍然有值。是不是这样啊?
我以前的理解是输入完毕后加上null,后面的就全是null了。
你的两个理解大致都没有问题。
首先,因为你没有初始化数组str[100]的值,因此它内部可能有值。
其次,你以前的理解(以前的理解是输入完毕后加上null,后面的就全是null了),有个前提条件,就是你初始化数组str[100]为NULLL
为了说明你以前理解的问题所在,我在你的源代码上添加了初始化数组str[100]为NULLL,T同时将 unsigned i =99;    //为字符串str创建足够长度   改为   int i =99;    //为字符串str创建足够长度
这样就没有改变你的思维,并且你的代码也能正常运行。具体见下列代码:

#include <stdio.h>
 
// 倒序显示字符串(不换行)
void put_string(const char str[])
{
     int i =99;    //为字符串str创建足够长度
     while (!str) i--;     //找到字符串str输入的最后一位;
   
     for (;i>=0;i--)        //字符串str最后一位开始显示到第一位;
         {putchar(str);}
}
 
int main(void)
{
    char str[100]={0};  // 初始化后数组内的内容就全为NULL了
   
    printf("请输入字符串:");
    scanf("%s", str);
   
    put_string(str);
    putchar('\n');
   
    return (0);   
}

非常感谢。不仅解答了我的疑问,还让我对C有了更深刻的认识。
2018-07-30 16:56
no1xijin
Rank: 9Rank: 9Rank: 9
来 自:江西
等 级:贵宾
威 望:20
帖 子:211
专家分:1207
注 册:2015-7-8
收藏
得分:0 
回复 7楼 st518
然而你把分都给了2楼。。。

126邮箱联系方式:no1xijin@126. com
2018-07-30 19:16
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
2018-07-30 21:35
快速回复:逆向输出,结果是乱码,求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019498 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved