| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 663 人关注过本帖
标题:关于数组越界的问题
只看楼主 加入收藏
rib
Rank: 4
等 级:业余侠客
帖 子:95
专家分:252
注 册:2009-3-30
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:9 
关于数组越界的问题
程序代码:
#include<stdio.h>

int main(void)
{
    char st[20];
    char *p;
    int i;
    i = 0;
    p = st;
    scanf("%s",p);
    for (i = 0; st[i] != '\0'; i ++,p++)
    {
        if(*p == 'k')
        {
            printf("there is a 'k' in the strint\n");

            break;
        }
    }
    if (*p == '\0')
    {
        printf("there is no 'k' in the string\n");
    }

    return 0;

}
这个程序如果K出现在20个字符以后还能显示有个K在字符中,不知是编译器的问题,还是我想的不对!





[ 本帖最后由 rib 于 2010-3-20 08:08 编辑 ]
2010-03-19 17:21
风之上位
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:55
专家分:156
注 册:2009-12-20
收藏
得分:1 
是循环终止条件有问题
当你输入超过19时st[19]就不是'\0'了
2010-03-19 17:44
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:1 
当输入的内容越界时,越界的那一部份会污染其它变量的值,有可能是你用的p,这样p指向的值就已经不是st了,你要在scanf后面再给p赋一次值
当然如LS所说,越界后st[19]就不是'\0'了,'\0'跑到你输入的最后那一个字节的后面了

该程序有不确定的因素会导致错误。。。
2010-03-19 18:02
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
输入个数大于20的
看看输出结果
#include <stdio.h>

void main()
{
    char st[20];
    int i;
    printf("input a string:");
    scanf("%s",st);
    for( i = 0; st[i] != '\0'; i++)
        printf("%c ",st[i]);
}
2010-03-19 18:04
csj_65
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:63
专家分:163
注 册:2010-3-12
收藏
得分:0 
#include<stdio.h>

int main(void)
{
    char st[20];
    char *p;
    int i;
    int youk=0;
    p = st;
    scanf("%s",p);

    for (i = 0; *(p+i) != '\0' ; i ++)
    {
        if((*(p+i)=='k') && (i<=19))
        {
            printf("there is a 'k' in the strint\n");
            youk=1;
            break;
        }
    }

    if (!youk)
    {
        printf("there is no 'k' in the string\n");
    }

    return 0;
}
可以用指针来做,这样不容易出错。这个你看看。
2010-03-19 19:01
mikelr
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:161
注 册:2010-3-17
收藏
得分:8 
是数组越界的问题。你不能输入超过19个字符。
#include<stdio.h>

int main(void)
{
    char st[20];
    char *p;
    int i;
    i = 0;
    p = st;
    scanf("%19s",p);  //注意这句改成  %19s  ,限制只读入19字符
    for (i = 0; st[i] != '\0'; i ++,p++)
    {
        if(*p == 'k')
        {
            printf("there is a 'k' in the strint\n");

            break;
        }
    }
    if (*p == '\0')
    {
        printf("there is no 'k' in the string\n");
    }

    return 0;

}

2010-03-19 19:06
lvkush0903
Rank: 1
等 级:新手上路
帖 子:2
专家分:7
注 册:2006-8-11
收藏
得分:0 
char st[20]没有初始化 ,天知道st[19]中放的是不是0
安全性不足
2010-03-19 21:55
rib
Rank: 4
等 级:业余侠客
帖 子:95
专家分:252
注 册:2009-3-30
收藏
得分:0 
回复 4楼 寒风中的细雨
我输入了超过20个数     输出的也是一模一样的
2010-03-20 08:12
rib
Rank: 4
等 级:业余侠客
帖 子:95
专家分:252
注 册:2009-3-30
收藏
得分:0 
回复 5楼 csj_65


你这段程序后面加个printf("%s",st);
最后还是按你原样的输入       输出
2010-03-20 08:19
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
回复 8楼 rib
数组的存放是在一片连续的存储空间
 数组名 就是这个空间的入口

你输入的多少 和你的数组定义的长度没有关系
就和 int *p;   char c[20];
p = c ;
这个时候 如果对p进行操作  你可以想输入几个字符 都行
p和 c的 指向是相同的 而在数组定义的时候是根据需要
而进行了长度的限定
所以 在输出的时候 你不加或限定条件不正确 它可以输出你
所输入的全部字符  前提是你的输入要大于定义的长度
而后面(没有开辟的)的空间 是不支持 r(读)操作的
所以 不能访问 内存的
2010-03-21 09:50
快速回复:关于数组越界的问题
数据加载中...
 
   



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

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