none
C的一个新手问题!望大家帮助 RRS feed

  • 问题

  • 我刚开始学习C语言,使用编译器vs2010 32位简体中文版在编译以下程序时提示错误“Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.”,哪位能告诉我下这个是为什么,怎么样才能有效解决这个为您提。

    代码部分

    #include<stdio.h>
    
    #include<stdlib.h>
    
    int main()
    
    {
    
    	int i,j,k,m,t,count;
    
    	int a[100] = {0};
    
    	int c;
    
    	for(i = 0;i<100;i++) //计数器、数组赋值部分
    
    	{
    
    		count = i;
    
    		scanf("%d\\",&c);
    
    		if(c==(int)'\n') break;
    
    		a[i] = c;
    
    		count = i+1;
    
    	}
    
    	for(m = count-1;m>0;m--) //冒泡部分
    
    	{
    
    		if(count<=1) break;
    
    		for(j = 0;j<count;j++)
    
    		{
    
    			if(a[j]>a[j+1])
    
    			{
    
    				t = a[j+1];
    
    				a[j+1] = a[j];
    
    				a[j] = t;
    
    			}
    
    		}
    
    	}
    
    	for(k = 0;k<count;k++) //按冒泡排序输出部分
    
    	{
    
    		printf("%d>>",a[k]);
    
    	}
    
    	printf("%d\n",count);
    
    	printf("\n");
    
    	system("pause"); //按任意键继续..
    
    	return 0;
    
    }
    
    



    • 已编辑 仙人球球 2011年8月24日 0:55 修改代码注释
    2011年8月24日 0:48

答案

  • 那个错误的意思是程序在运行中有数组越界的情况


    0xBAADF00D
    2011年8月24日 1:11
    版主
  • 你好,

     

    由于您设置的for循环判断条件为x!=(int)'\n'。而(int)'\n'的值为10.因此您的排序无法对还有10的数组进行判断。 我建议您可以考虑在输入的时候首先允许用户输入需要排序的个数,这样也可以省去计算总数的步骤。这是我对您的代码的一点修改。

    scanf("%d\,",&count);//先输入需要计算的总数

    for(i = 0;i < count;i++) //给数组元素赋值;

    {

                    scanf("%d\,",&x);

                    a[i] = x;                

    }

     

    希望我的建议能够帮助您解决您的问题。


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月25日 7:40
  • 我也是个菜鸟,但我觉得你可能越界的地方有两点

    if(a[j]>a[j+1])

    当j=coute-1的时候,j+1越界;

    还有一处if(c==(int)'\n')

    我以前不是这样处理的,我也不大清楚Enterj键输出的是什么字符

    if(gerchar()==‘’)这是我以前的处理方式,希望对你有用

    2011年8月26日 3:44

全部回复

  • 那个错误的意思是程序在运行中有数组越界的情况


    0xBAADF00D
    2011年8月24日 1:11
    版主
  • #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
    	int i,j,k,m,t,x;
    	int a[100] = {0},count=0;
    	scanf("%d\,",&x);
    	for(i = 0;x!=(int)'\n';i++) //计算输入数组元素个数;给数组元素赋值;
    	{
    		a[i] = x;
    		count = i+1;
    		scanf("%d\,",&x);
    	}
    	for(m = count-1;m>0;m--) //冒泡排序功能
    	{
    		if(count<=1) break;
    		for(j = 0;j<count-1;j++)
    		{
    			if(a[j]>a[j+1])
    			{
    				t = a[j+1];
    				a[j+1] = a[j];
    				a[j] = t;
    			}
    		}
    	}
    	for(k = 0;k<count;k++) //输出经过冒泡排序后的数组元素
    	{
    		printf("%d>>",a[k]);
    	}
    	if(k==count) printf("\n");
    	printf("计数器的数值为:%d\n",count);
    	//printf("回车的ASCII码:%d\n",'\n');//查看回车ASCII码
    	system("pause");
    	return 0;
    }

    这个是我吧问题解决之后的程序代码,大家也给点意见。虽然上面我提出的问题也解决了,但是感觉在输入上不够完美,vonger说的对,后来我也发现是数组越界问题
    煮酒论英雄
    2011年8月24日 3:13
  • 你好,

     

    由于您设置的for循环判断条件为x!=(int)'\n'。而(int)'\n'的值为10.因此您的排序无法对还有10的数组进行判断。 我建议您可以考虑在输入的时候首先允许用户输入需要排序的个数,这样也可以省去计算总数的步骤。这是我对您的代码的一点修改。

    scanf("%d\,",&count);//先输入需要计算的总数

    for(i = 0;i < count;i++) //给数组元素赋值;

    {

                    scanf("%d\,",&x);

                    a[i] = x;                

    }

     

    希望我的建议能够帮助您解决您的问题。


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月25日 7:40
  • 我也是个菜鸟,但我觉得你可能越界的地方有两点

    if(a[j]>a[j+1])

    当j=coute-1的时候,j+1越界;

    还有一处if(c==(int)'\n')

    我以前不是这样处理的,我也不大清楚Enterj键输出的是什么字符

    if(gerchar()==‘’)这是我以前的处理方式,希望对你有用

    2011年8月26日 3:44
  • 非常感谢,这回懂了
    煮酒论英雄
    2011年8月28日 9:51
  • 共同学习 嘿嘿
    煮酒论英雄
    2011年8月28日 9:52