11063216906 发表于 2026-7-11 21:45:25

@FishC C语言中 %s和%c分别表示什么

FishC 发表于 2026-7-11 21:45:34

11063216906 发表于 2026-07-11 21:45
@FishC C语言中 %s和%c分别表示什么

C语言中 %s 和 %c 都是格式占位符,用在 printf 或 scanf 等函数中,告诉程序要处理的数据类型。

%c 代表 单个字符(char),例如:printf("%c", 'A'); 会输出大写字母 A。

%s 代表 字符串(string),也就是一个以 \0 结尾的字符数组,例如:printf("%s", "Hello"); 会输出 Hello。

简单记:%c 是一个字符,%s 是一串字符(字符串)。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

11063216906 发表于 2026-7-11 21:47:57

FishC 发表于 2026-7-11 21:45
C语言中 %s 和 %c 都是格式占位符,用在 printf 或 scanf 等函数中,告诉程序要处理的数据类型。

我现在用char *s = "HI!";
printf("%s", s);       // HI!
printf("%s", s + 1);   // I!

printf("%c", *s);      // H
printf("%c", *(s + 1));// I
他们的输出结果是什么 为什么

FishC 发表于 2026-7-11 21:48:05

11063216906 发表于 2026-07-11 21:47
FishC 发表于 2026-7-11 21:45
C语言中 %s 和 %c 都 ...

第一个 printf("%s", s); 输出 HI!
因为 s 指向字符串 "HI!" 的首字符 'H',%s 会从该地址开始输出直到遇到 '\0'。

第二个 printf("%s", s + 1); 输出 I!
因为 s + 1 指向第二个字符 'I',从那里开始输出到结尾。

第三个 printf("%c", *s); 输出 H
*s 解引用得到第一个字符 'H',%c 打印单个字符。

第四个 printf("%c", *(s + 1)); 输出 I
*(s + 1) 得到第二个字符 'I'。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

11063216906 发表于 2026-7-11 21:50:25

FishC 发表于 2026-7-11 21:48
第一个 printf("%s", s); 输出 HI!
因为 s 指向字符串 "HI!" 的首字符 'H',%s 会从该地址开始输出 ...

我在第一个printf("%s", s); 中我可以用printf("%s", *s); 吗?

FishC 发表于 2026-7-11 21:50:29

11063216906 发表于 2026-07-11 21:50
FishC 发表于 2026-7-11 21:48
第一个 printf("%s",...

不能。`%s` 要求传入一个指向字符串首字符的指针(即 `char*` 类型),而 `*s` 是解引用后得到的单个字符(`char` 类型),类型不匹配。尝试使用 `printf("%s", *s);` 会导致未定义行为,因为程序会试图将字符值解释为地址,通常会导致程序崩溃或输出乱码。

正确写法是 `printf("%s", s);` 或者 `printf("%s", &(*s));`(这样多此一举),但直接传指针即可。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

11063216906 发表于 2026-7-12 13:15:20

FishC 发表于 2026-7-11 21:50
不能。`%s` 要求传入一个指向字符串首字符的指针(即 `char*` 类型),而 `*s` 是解引用后得到的单个字 ...

malloc在C中干嘛的

FishC 发表于 2026-7-12 13:15:24

11063216906 发表于 2026-07-12 13:15
FishC 发表于 2026-7-11 21:50
不能。`%s` 要求传入 ...

malloc 是 C 语言中用来在程序运行时 动态分配内存 的函数。它的作用是在堆(heap)上申请一块指定大小的连续内存空间,并返回指向这块内存首地址的指针。如果你需要创建大小不固定或需要在函数返回后依然有效的数组/结构体,就可以用 malloc。例如:


int *p = (int*)malloc(10 * sizeof(int));


这行代码申请了一块能存放 10 个 int 类型数据的内存,返回的指针赋值给 p。使用完毕后,记得用 free(p) 释放内存,否则会造成内存泄漏。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

11063216906 发表于 2026-7-12 16:48:53

FishC 发表于 2026-7-12 13:15
malloc 是 C 语言中用来在程序运行时 动态分配内存 的函数。它的作用是在堆(heap)上申请一块指定大小 ...

堆和栈的区别

FishC 发表于 2026-7-12 16:48:58

11063216906 发表于 2026-07-12 16:48
FishC 发表于 2026-7-12 13:15
malloc 是 C 语言中用 ...

堆(Heap)和栈(Stack)是C语言(及其他编程语言)中两种重要的内存区域,主要区别如下:

栈(Stack)
- 由编译器自动管理,用于存储局部变量、函数调用参数、返回地址等。
- 分配速度快,因为它是连续分配,且遵循后进先出(LIFO)原则。
- 每个线程有自己的栈,大小通常固定(如1MB~8MB),超出会栈溢出。
- 变量生命周期随函数调用结束而自动销毁,无需手动释放。

堆(Heap)
- 由程序员通过 malloc()、calloc() 等函数手动分配,通过 free() 释放。
- 分配速度较慢,因为需要查找空闲内存块,且可能产生碎片。
- 所有线程共享一个堆(但访问需加锁),大小受限于系统物理内存/虚拟内存。
- 变量生命周期由程序员控制,不会自动释放,必须手动释放,否则会造成内存泄漏。

简单记:栈是自动管理、速度快、空间小;堆是手动管理、速度较慢、空间大(可动态扩展)。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

11063216906 发表于 2026-7-12 16:51:35

FishC 发表于 2026-7-12 16:48
堆(Heap)和栈(Stack)是C语言(及其他编程语言)中两种重要的内存区域,主要区别如下:

栈(Stac ...

堆是遵循fifo吗

FishC 发表于 2026-7-12 16:51:42

11063216906 发表于 2026-07-12 16:51
FishC 发表于 2026-7-12 16:48
堆(Heap)和栈(Stac ...

不是的,堆(heap)不遵循FIFO(先进先出)。堆是一种自由存储区域,程序员可以任意顺序分配和释放内存块,与分配的顺序无关。例如,你可以先分配A,再分配B,然后先释放A再释放B,或者先释放B再释放A,都是允许的。系统只负责在空闲内存中寻找合适大小的块,并不强加任何顺序约束。你提到的FIFO通常用于队列(queue)数据结构,而不是内存管理中的堆。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

11063216906 发表于 2026-7-12 16:55:16

FishC 发表于 2026-7-12 16:48
堆(Heap)和栈(Stack)是C语言(及其他编程语言)中两种重要的内存区域,主要区别如下:

栈(Stac ...

scanf有什么用

FishC 发表于 2026-7-12 16:55:20

11063216906 发表于 2026-07-12 16:55
FishC 发表于 2026-7-12 16:48
堆(Heap)和栈(Stac ...

scanf 是 C 标准库中的一个输入函数,用于从标准输入(通常是键盘)读取数据,并根据指定的格式字符串将读取到的内容存入变量中。例如:


int age;
scanf("%d", &age);   // 读取一个整数并存入 age 变量


注意:变量前必须加 & 取地址符(除了数组名本身已是指针的情况)。它相当于 printf 的反向操作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

11063216906 发表于 2026-7-12 17:03:42

FishC 发表于 2026-7-12 16:55
scanf 是 C 标准库中的一个输入函数,用于从标准输入(通常是键盘)读取数据,并根据指定的格式字符串 ...

给我解释一下file I/O

FishC 发表于 2026-7-12 17:03:50

11063216906 发表于 2026-07-12 17:03
FishC 发表于 2026-7-12 16:55
scanf 是 C 标准库中 ...

文件 I/O(Input/Output)即文件输入输出,是程序与硬盘上的文件之间进行数据交换的过程。

- 输入(Input)指从文件读取数据到程序内存;
- 输出(Output)指将程序内存中的数据写入文件。

C 语言中通过标准库函数(如 fopen、fclose、fread、fwrite、fprintf、fscanf)来操作文件。基本步骤:
1. 用 fopen() 打开文件,获得一个 FILE* 指针;
2. 通过该指针调用读写函数;
3. 使用完毕后用 fclose() 关闭文件。

例如:

FILE *fp = fopen("data.txt", "r");// 以读模式打开
if (fp != NULL) {
    char ch = fgetc(fp);            // 读取一个字符
    fclose(fp);
}


文件 I/O 让程序可以持久化存储数据,或读取配置文件、日志等,是编程中非常基础且重要的能力。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

11063216906 发表于 2026-8-1 09:48:50

FishC 发表于 2026-7-12 17:03
文件 I/O(Input/Output)即文件输入输出,是程序与硬盘上的文件之间进行数据交换的过程。

- 输入 ...

我还有个问题 在C语言中我用signed int存储(2 ^32 )-1 的结果 为什么和 unsigned情况下不同 哪个是正确的 我该如何理解这件事

FishC 发表于 2026-8-1 09:49:03

11063216906 发表于 2026-08-01 09:48
FishC 发表于 2026-7-12 17:03
文件 I/O(Input/Outp ...

这是一个非常典型且重要的概念:**计算机存储的是二进制位,类型决定了解释方式**。

假设你的 int 和 unsigned int 都是32位。(2^32)-1 的二进制结果是 **32个1**,即:

11111111 11111111 11111111 11111111

现在将这个位模式分别赋给两种类型:

- 如果存入 unsigned int,它按无符号规则解释,最高位不再是符号位,所以这个位模式就是 4294967295。

- 如果存入 signed int,它按补码解释,最高位是符号位(1表示负数),32个1对应的补码值正好是 -1。

所以两个结果都“正确”,但前提是:这个数值在对应类型的范围内。4294967295 超出了 signed int 的最大值,属于溢出,结果是实现定义行为(多数编译器直接得到 -1)。而 unsigned int 能完全表示它,所以得到 4294967295。

理解的关键是:**内存里存的位一模一样,只是读法不同**。类型系统告诉你这些位该怎么翻译。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

11063216906 发表于 2026-8-1 10:03:42

FishC 发表于 2026-8-1 09:49
这是一个非常典型且重要的概念:**计算机存储的是二进制位,类型决定了解释方式**。

假设你的 int...

为什么8位情况下补码-128 是 10000000

FishC 发表于 2026-8-1 10:03:53

11063216906 发表于 2026-08-01 10:03
FishC 发表于 2026-8-1 09:49
这是一个非常典型且重 ...

8位二进制补码能表示的范围是 -128 到 127,而 -128 的补码确实是 10000000。这里面需要一点“特殊规则”。

补码设计原则是:正数的补码和原码相同,负数的补码是“对应正数取反再加1”。但 -128 没有对应的“+128”正数(因为8位有符号数最大只能到127),所以它只能靠特殊位置来承载。

你可以这样理解验证:

- 10000000 如果当作无符号数,就是 128。
- 但当作有符号补码时,最高位是符号位,1 表示负数。
- 补码转回真实值的方法:符号位不动,其余位按位取反再加1。
对于 10000000:符号位1,其余位取反得 1111111,再加1得 10000000,即128。
因此它代表 -128。

再换个角度:

- -127 的补码是 10000001。
- -128 的补码 10000000 再加上 1,正好变成 10000001,也就是 -127。
- 这说明 10000000 往前走一步就是 -127,所以它只能是 -128。

为什么不能是 -0?因为补码里 0 只有一种表示 00000000,不存在“负零”。这样省下来的编码就多表示了一个负数,所以8位补码的下限不是 -127,而是 -128。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: 1 [2] 3 4 5 6 7
查看完整版本: 浮点数存取问题