当前位置:编程学习 > C/C++ >>

这是我的杭电2027的代码为什么已提交就是Runtime Error (ACCESS_VIOLATION)啊,请问是哪的问题

#include<stdio.h> #include<malloc.h> int main() { int n,i; char *p; char a[6]={"aeiou"}; p=(char *)malloc(110); scanf("%d",&n); getchar(); while(n--) { int s[]={0,0,0,0,0}; gets(p); while(*p!='\0') { switch(*p) { case 'a':s[0]++;break;case 'e':s[1]++;break;case 'i':s[2]++;break; case 'o':s[3]++;break;case 'u':s[4]++;break; } p++; } for(i=0;i<5;i++) printf("%c:%d\n",a[i],s[i]); if(n) printf("\n"); } return 0; }
答案:runtime - error, 表示运行时错误, (access violation 表示访问越界)
问题出在你的p指针上, 当执行完组数据时, 你的p指针没有指向申请的空间的起始地址,而是
当前这组测试数据的最后一个字符的地址, 当执行多组数据后,p指针会指向申请空间意外的地方,所以访问越界。
我加了一个q指针, 保存申请空间的起始地址,执行一组测试数据后,p = q; 这样就不会越界了。
#include<stdio.h>
#include<malloc.h>
int main()
{
 int n,i;
 
 char *p, *q;
 char a[6]={"aeiou"};
 p=(char *)malloc(110);
 q = p;
 scanf("%d",&n);
 getchar();
 while(n--)
 {
  int s[]={0,0,0,0,0};
  gets(p);
  while(*p!='\0')
  {
   switch(*p)
   {
   case 'a':s[0]++;break;case 'e':s[1]++;break;case 'i':s[2]++;break;
   case 'o':s[3]++;break;case 'u':s[4]++;break;
   }
   p++;
  }
  p = q;
  for(i=0;i<5;i++)
   printf("%c:%d\n",a[i],s[i]);
  if(n)
   printf("\n");
 }
 return 0;
}
其他:p++;之后p指向的下一个字节的地址了吧?
之前的就找不到了
下次再gets(p)就可能超过原来malloc分配的空间了
不能直接对p进行++操作,用另一个指针试试

上一个:你好,你有福建c语言二级考试的试题与答案吗?发给我可以吗?2680724224@qq.com谢谢
下一个:C++语言课程设计任务书

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,