【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同学的代码为例进行一波调试(公开处刑,开溜)

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


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那个

【NEFU锐格】C语言大一下板子 & Debug_#include_02

然后把你程序旁边的行号全部点红(点数字旁边的空白处,不要点在数字上)

【NEFU锐格】C语言大一下板子 & Debug_#include_03


接下来把你的目光移动到编译允许按钮那一行,在他们的右边有一个红色三角形出来的黑框框调试器就运行起来了

此时你可能会发现没法输入,因为程序现在是一步步暂停的,注意时刻关注行号的旁边红点,其中有三角形的就是当前运行到的位置

【NEFU锐格】C语言大一下板子 & Debug_代码片_04


我们接下来需要手动控制程序的运行,一般的我们只需要点击下方的第三个按钮(Next Line)当我们运行到scanf时就输入相应数据然后继续按第三个按钮一步步运行程序

【NEFU锐格】C语言大一下板子 & Debug_代码片_05


经过一波疯狂点击后Codeblock就会给你报错了(弹出黄色框框)

【NEFU锐格】C语言大一下板子 & Debug_#include_06


此时查看有黄色三角的行号就是发生段错误的地方。

接下来就要通过你的理论知识来分析这里发生了什么问题。

补充:有的人可能发现自己调试的时候没有watchs(变量监视)和call stack两个窗口,这个你们可以找到红色三角那行,倒数第二个按钮(Debugging windows)勾选相应选项即可

【NEFU锐格】C语言大一下板子 & Debug_代码片_07

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

套取数据

char c;
while(c=getchar()&&c!=EOF)
{
printf("%c",&c);
}