论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

语言_关于数组越界的问题

文章类别:C语言程序设计 | 发表日期:2010-3-21 12:51:31

C语言_关于数组越界的问题

21视频教程网C语言编辑部3月21日整理

学生:

程序代码:

#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在字符中,不知是编译器的问题,还是我想的不对!

C语言视频教程:

是循环终止条件有问题
当你输入超过19时st[19]就不是'\0'了

C语言视频教程:

当输入的内容越界时,越界的那一部份会污染其它变量的值,有可能是你用的p,这样p指向的值就已经不是st了,你要在scanf后面再给p赋一次值
当然如LS所说,越界后st[19]就不是'\0'了,'\0'跑到你输入的最后那一个字节的后面了

该程序有不确定的因素会导致错误。。。

C语言视频教程:

输入个数大于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]);
}

C语言视频教程:

#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;
}
可以用指针来做,这样不容易出错。这个你看看。

C语言视频教程:

是数组越界的问题。你不能输入超过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;

}

学生:

我输入了超过20个数     输出的也是一模一样的

C语言视频教程:

你这段程序后面加个printf("%s",st);
最后还是按你原样的输入       输出

数组的存放是在一片连续的存储空间
数组名 就是这个空间的入口

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

学生:

谢谢

C语言视频教程编辑部

视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058