| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2420 人关注过本帖
标题:循环和数组的小问题,这里为什么不能退出循环?
只看楼主 加入收藏
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
结帖率:96.15%
收藏
已结贴  问题点数:10 回复次数:10 
循环和数组的小问题,这里为什么不能退出循环?
程序如下所示
#include <stdio.h>
#include <string.h>
int main(void)
{
        unsigned long i, size;
    char SIZE[255], NEW_SIZE[255];

    for(i = 0; i < 255; i++)
    {
       scanf("%c", &SIZE[i]);
       while(getchar() != '\n')
           continue;
    }
    size = strlen(SIZE);
    for(i = size; i >= 0; i--)
        printf("%c", NEW_SIZE[size]);
    return 0;
}
无论输入什么都无法启动程序,检查了很多遍依然不知道问题出在哪里~
搜索更多相关主题的帖子: return include continue 
2016-08-20 13:51
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:10 
不是不能退出,而是要好久才行,,,相信你是用错了。。
 for(i = 0; i < 255; i++)//循环执行255次
    {
       scanf("%c", &SIZE[i]);//读一个字符
       while(getchar() != '\n')//必须读到一个回车符才能跳出这个循环
           continue;
    }
这就意味着你必须给出255个回车符的输入才能跳出这个循环(不信你可以把255改成5,然后输入数据测试一下,你中间输入的字符串不管多少个,都白搭)。
而我认为你的初衷应该是读一个不长于255字符的字符串,遇到回车符跳出循环。那么这个地方就应该修改如下
for(i = 0; i < 255; i++)//
    {
       scanf("%c", &SIZE[i]);//
        if(SIZE[i]=='\n')//如果这次读入的字符是回车符,那就把这个位置写入‘\0’(字符串结束标记),并且跳出for循环
           {SIZE[i]='\0';
            break;}
    }

另外我要提醒你一件事,strlen()函数返回的是从一开始计数的字符串长度,而我们在数组中存放数据的时候通常是从0开始,也就是说,字符串的结尾应该在[strlen()-1].你的代码应该是实现字符串倒序,所以我建议你第二个for循环初始化i=size-1。


[此贴子已经被作者于2016-8-20 14:13编辑过]


φ(゜▽゜*)♪
2016-08-20 14:10
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
收藏
得分:0 
1. strlen 的参数应该是一个字符串,即以 '\0' 结尾的字符数组,而 SIZE 仅仅只是一个字符数组,所以用 strlen 去获取它的长度显然是错误的(获取到的长度是错误的)
2. 把 i 声明成 unsigned ,在这里显然也是错误的,导致第二个循环是一个死循环(i=0 时,再进行 i--,不是 -1)

[此贴子已经被作者于2016-8-20 14:19编辑过]


Read The Fucking Source Code~
2016-08-20 14:17
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 3楼 zx315
字符串也是数组哦,只不过是在里面加了一个\0,strlen函数计算长度的时候也就是以\0为标准,而sizeof()则是根据申明的大小进行返回的,不信你可以试试

char a[20]="Hello world!"
strlen(a)--->12
sizeof(a)--->20

φ(゜▽゜*)♪
2016-08-20 14:36
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
收藏
得分:0 
回复 2楼 书生牛犊
修改过的程序如下
#include <stdio.h>
#include <string.h>
int main(void)
{
         int i, size;
    char SIZE[255], NEW_SIZE[255];

    for(i = 0; i < 255; i++)
    {
       scanf("%c", &SIZE[i]);
       if(SIZE[i] == '\n')
       {
           SIZE[i] = '\0';
           break;
       }
    }
    size = strlen(SIZE);
    for(i = size-1; i >= -1; i--)
        printf("%c", NEW_SIZE[size]);
    return 0;
}
这次是输入任何结果都会直接终止程序
2016-08-20 14:38
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
https://bbs.bccn.net/thread-466562-1-1.html
去看看,试着自己找原因。
2016-08-20 15:05
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 5楼 Eahonxu
一些小问题,还是你自己找吧。

[此贴子已经被作者于2016-8-20 15:24编辑过]

2016-08-20 15:17
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
收藏
得分:0 
回复 7楼 ehszt
我真的不知道啊T^T已经对着电脑枯坐了一个小时了,什么也没想出来T^T
2016-08-20 15:49
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 8楼 Eahonxu
回复 2楼 书生牛犊
修改过的程序如下
#include <stdio.h>
#include <string.h>
int main(void)
{
         int i, size;
    char SIZE[255], NEW_SIZE[255];

    for(i = 0; i < 255; i++)
    {
       scanf("%c", &SIZE[i]);
       if(SIZE[i] == '\n')
       {
           SIZE[i] = '\0';
           break;
       }
    }
    size = strlen(SIZE);
    for(i = size-1; i >= -1; i--)    //....i>=-1....希望你注意数组下标访问不要低于0,否则程序会直接崩溃。。。
        printf("%c", NEW_SIZE[size]);   //你明明把字符保存在SIZE[]里面,输出New_SIZE[]能输出什么结果?而且NEW_SIZE[size]在这个循环中好像
                               //都是指向同一个位置,,,SIZE[size]的位置保存的字符是‘\0’.
    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册



[此贴子已经被作者于2016-8-20 21:08编辑过]


φ(゜▽゜*)♪
2016-08-20 20:52
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
收藏
得分:0 
回复 9楼 书生牛犊
我并没有说字符串不是字符数组……而是楼主的代码中,SIZE 仅仅只是一个字符数组,而非 C 意义上的字符串,即非以 '\0' 作为结尾,所以调用 strlen  去获取其长度是错误的……

另外,死循环也不是因为 i < 0 导致的,而是当 i = 0 时,由于楼主把 i 声明为一个 unsigned 类型,所以 i-- 会溢出,C 语言对无符号整数发生溢出是有定义的:对 2^n 求模,所以变成了 ULONG_MAX ,然后一直死循环下去……

[此贴子已经被作者于2016-8-21 12:12编辑过]

收到的鲜花
  • 书生牛犊2016-08-21 12:54 送鲜花  10朵   附言:我很赞同

Read The Fucking Source Code~
2016-08-21 12:05
快速回复:循环和数组的小问题,这里为什么不能退出循环?
数据加载中...
 
   



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

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