scanf 读输入
scanf 等你输入两个数,在输出面板里直接输入。
#include <stdio.h>
int main(void) {
int a, b;
scanf("%d %d", &a, &b);
printf("%d + %d = %d\n", a, b, a + b);
return 0;
}免费,不用装 gcc,不用登录。写完就跑,还能一步一步看每个指针、每块 malloc 出来的内存。
每个变量在它那层函数的栈帧里,malloc 出来的块在右边的堆上,指针就是一根箭头。free 掉的块变灰,没人指着又没 free 的标红。
像在本地用 VS Code 一样顺手,还多了本地没有的:把每一步画出来。
按「单步」,代码停在每一行:亮的是马上要跑的那行,旁边是此刻每个变量的值。也能往回退,← → 键就能走。

报错下面有「看看怎么错的」:可视化停在出错的那一步,红色标出来,还用人话说清楚原因。前面每一步都能倒回去看。

一个链接打开就是这段代码;也能导出运行过程的动图(浅色 / 深色、横版 / 竖版)和代码图片,发到 X、小红书、群聊,或嵌进博客。

每个都能单步、能可视化,改一改再跑。
scanf 等你输入两个数,在输出面板里直接输入。
#include <stdio.h>
int main(void) {
int a, b;
scanf("%d %d", &a, &b);
printf("%d + %d = %d\n", a, b, a + b);
return 0;
}经典题:为什么 swap 要传 &x、&y。
#include <stdio.h>
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
int main(void) {
int x = 3, y = 5;
swap(&x, &y);
printf("%d %d\n", x, y);
return 0;
}a[i] 和 *(p + i) 是同一个元素。
#include <stdio.h>
int main(void) {
int a[4] = {10, 20, 30, 40};
int *p = a;
for (int i = 0; i < 4; i++)
printf("%d %d\n", a[i], *(p + i));
return 0;
}字符数组、strlen,从两头往中间交换。
#include <stdio.h>
#include <string.h>
int main(void) {
char s[20] = "hello";
int n = strlen(s);
for (int i = 0; i < n / 2; i++) {
char t = s[i];
s[i] = s[n - 1 - i];
s[n - 1 - i] = t;
}
printf("%s\n", s);
return 0;
}在堆上要 n 个 int,用完 free。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 5;
int *sq = malloc(n * sizeof(int));
for (int i = 0; i < n; i++)
sq[i] = i * i;
for (int i = 0; i < n; i++)
printf("%d ", sq[i]);
printf("\n");
free(sq);
return 0;
}在一组学生里找最高分。
#include <stdio.h>
struct Stu {
char name[10];
int score;
};
int main(void) {
struct Stu s[3] = {{"Lin", 88}, {"Zhou", 95}, {"Chen", 79}};
int best = 0;
for (int i = 1; i < 3; i++)
if (s[i].score > s[best].score) best = i;
printf("%s %d\n", s[best].name, s[best].score);
return 0;
}用 malloc 建节点、指针连起来,最后一个个 free。
#include <stdio.h>
#include <stdlib.h>
struct Node {
int val;
struct Node *next;
};
int main(void) {
struct Node *head = NULL;
for (int i = 3; i >= 1; i--) {
struct Node *p = malloc(sizeof(struct Node));
p->val = i;
p->next = head;
head = p;
}
for (struct Node *p = head; p != NULL; p = p->next)
printf("%d ", p->val);
printf("\n");
while (head) {
struct Node *nx = head->next;
free(head);
head = nx;
}
return 0;
}乘法表,在可视化里按表格画出来。
#include <stdio.h>
int main(void) {
int t[3][4];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 4; j++)
t[i][j] = (i + 1) * (j + 1);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++)
printf("%3d", t[i][j]);
printf("\n");
}
return 0;
}函数调用自己:看栈帧一层层叠起来。
#include <stdio.h>
int fib(int n) {
if (n <= 2) return 1;
return fib(n - 1) + fib(n - 2);
}
int main(void) {
printf("%d\n", fib(6));
return 0;
}相邻两个比较交换,直到整个数组排好。
#include <stdio.h>
int main(void) {
int a[6] = {5, 2, 9, 1, 7, 3};
int n = 6;
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - 1 - i; j++)
if (a[j] > a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
for (int i = 0; i < n; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}循环、% 和 if / else if。
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 15; i++) {
if (i % 15 == 0) printf("FizzBuzz\n");
else if (i % 3 == 0) printf("Fizz\n");
else if (i % 5 == 0) printf("Buzz\n");
else printf("%d\n", i);
}
return 0;
}真 gcc 会悄悄跑下去;这里停在越界的那一下,告诉你为什么。
#include <stdio.h>
int main(void) {
int a[5] = {1, 2, 3, 4, 5};
int sum = 0;
for (int i = 0; i <= 5; i++)
sum += a[i];
printf("%d\n", sum);
return 0;
}都不用。打开就能写 C、能跑;代码存在你自己的浏览器里。
这是我们自己写、在你浏览器里运行的 C 引擎,对 C11 程序的输出和 gcc 13 一样。和 gcc 不同的是:数组越界这种「未定义行为」它会停下来,告诉你在哪一行。
运行到 scanf 时,输出面板里会出现输入框,输完按回车,程序接着跑。
点「可视化」:左边是栈,右边是堆,每个指针是一根箭头。free 掉的块变灰,泄漏的最后标红。
报错下面点「看看怎么错的」:可视化停在出错那一步,可以一步步往回看。
能。点一下代码就全屏写,有 Tab、花括号、分号这些专门的按键。
存在这个浏览器里,「我的代码」能找回来;重要的可以分享成链接存一份。
「分享」→ 复制链接,或者导出运行过程的动图、代码图片,一键发到 X。