【NEFU锐格】C语言大一下板子 & Debug

【NEFU锐格】C语言大一下板子

输入

多组

while(~scanf("%d",&n))
while(gets(a)!=NULL)

数字换行后字符输入吞字符问题(很重要)

while(~scanf("%d",&n))
{
	getchar();
	//getchar();如果1个不够那就来两个
	gets(s);
	//下面两个同理
	//scanf(" %s",&s);//你可以%s前加空格来代替上面getchar()的效果
	//scanf(" %c",&c);//你可以%c前加空格来代替上面getchar()的效果
	printf("%s\n",s);//检查以下输入是否正确
}

排序函数

swap

void swap(int *a,int *b)
{
    int tmp;
    tmp=*a;
	*a=*b;
	*b=tmp;
}

字符串

普通数组上学期应该都会了懒得写了
请熟练敲一遍实验四代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sort1(char **pp,int n)
{
	char tmp[100];
	for(int i=0;i<n;i++)
		for(int j=i+1;j<n;j++)
			if(strcmp(pp[i],pp[j])>0)
			{
				strcpy(tmp,pp[i]);
				strcpy(pp[i],pp[j]);
				strcpy(pp[j],tmp);
			}
    //补充完成程序
}
void output1(char *p[],int n)
{
	for(int i=0;i<n;i++)
		printf("%s\n",p[i]);
 //补充完成程序   
}
int main()
{
    void sort1(char **pp,int n);
    void output1(char *p[],int n);
    char str[50],*cp[20];
    int n,l,i;
    while(scanf("%d\n",&n)!=EOF)
    {
          for(i=0;i<n;i++)
          {
              gets(str);
             //start
             int len=strlen(str);
             cp[i]=(char*)malloc(len*sizeof(char)+1);
             strcpy(cp[i],str);
              //在此写动态开辟并存储程序
             //end
           }
           sort1(cp,n);
           output1(cp,n);
    }
    return 0;
}

结构体

在这里插入代码片

库函数

在这里插入代码片

指针

一维数组

在这里插入代码片

二维数组

在这里插入代码片

字符串指针

#include<stdio.h>
#include<stdlib.h>

int main()
{
	char str[]="hello";
	char *s=str;
	printf("%s",s);
}

多个字符串指针

指针数组的使用

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	char* cp[105];//数组:存储char*指针
	char str[20];
	int n;scanf("%d\n",&n);
	for(int i=0;i<n;i++)
	{
		gets(str);
		int len=strlen(str);
		cp[i]=(char *)malloc(len*sizeof(char));
		if(cp[i]==NULL)exit(0);
		strcpy(cp[i],str);
	}
	for(int i=0;i<n;i++)
	{
		printf("%s\n",cp[i]);
		free(cp[i]);
	}
}

指针调用函数

在这里插入代码片

动态内存申请

单个变量

在这里插入代码片

多个变量(指针数组)

在这里插入代码片

二维

在这里插入代码片

链表

Debug

CODEBLOCK GDB 调试段错误示例

让我们以YJJ同学的代码为例进行一波调试(公开处刑,开溜)

在这里插入图片描述
YJJ的代码

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int min, max;
void kk(int *p) {
  if (*p >= min && *p <= max)
    *p = 1;
  else
    *p = 0;
}
int main() {
  int n, min, max, *p, i, in_n;
  while (scanf("%d%d%d", &n, &min, &max) != EOF) {
    for (i = 0; i < n;) {
      scanf("%d", &in_n);
      *p = in_n;
      kk(*p);
      if (*p = 0) i = i + 1;
      if (*p = 1) break;
    }
    printf("%d %d", *p, in_n);
  }
  return 0;
}

输入

3   20  50
7
9
11
5  10  100
15
2  100  200
80
120

输出

0  11
1  15
1  120

首先确保你是创立项目工程了然后打开的main.c文件否则codeblock貌似不支持GDB调试

看到上方菜单栏的Debug选项,然后第一项Active Debugger选择GDB那个
在这里插入图片描述

然后把你程序旁边的行号全部点红(点数字旁边的空白处,不要点在数字上)
在这里插入图片描述
接下来把你的目光移动到编译允许按钮那一行,在他们的右边有一个红色三角形出来的黑框框调试器就运行起来了
此时你可能会发现没法输入,因为程序现在是一步步暂停的,注意时刻关注行号的旁边红点,其中有三角形的就是当前运行到的位置
在这里插入图片描述
我们接下来需要手动控制程序的运行,一般的我们只需要点击下方的第三个按钮(Next Line)当我们运行到scanf时就输入相应数据然后继续按第三个按钮一步步运行程序
在这里插入图片描述
经过一波疯狂点击后Codeblock就会给你报错了(弹出黄色框框)
在这里插入图片描述
此时查看有黄色三角的行号就是发生段错误的地方。
接下来就要通过你的理论知识来分析这里发生了什么问题。
补充:有的人可能发现自己调试的时候没有watchs(变量监视)和call stack两个窗口,这个你们可以找到红色三角那行,倒数第二个按钮(Debugging windows)勾选相应选项即可
在这里插入图片描述

由于YJJ同学的代码错误太多,我就先不调了,重写一遍更高效些。
上面的查找段错误的办法适合你已经基本消除编译器给你的warn和error警告,如果像YJJ同学那样还有一堆报错,则需要优先解决语法和逻辑上的漏洞。另外,如果样例测试了一遍没有报错,但是锐格还是返回了段错误,则需要考虑是否数据情况考虑不完全

套取数据

char c;
while(c=getchar()&&c!=EOF)
{
	printf("%c",&c);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值