C语言函数大全
本篇介绍C语言函数大全-- s 开头的函数(3)
1. sleep
1.1 函数说明
函数声明 | 函数功能 |
---|---|
unsigned int sleep(unsigned int seconds); |
它是 C 语言标准库中的函数,用于使当前进程挂起一定的时间。在挂起期间,操作系统会将该进程从调度队列中移除,直到指定的时间过去为止。 |
void Sleep(DWORD milliseconds); |
它是 Windows API 中的一部分,与 sleep 函数类似,它可以使当前线程挂起一段时间。 |
sleep 参数:
- seconds : 要挂起的时间,单位为秒
Sleep 参数:
- milliseconds: 要挂起的时间,单位为毫秒
1.2 演示示例
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("Start sleeping...\n");
sleep(5);
printf("Wake up!\n");
return 0;
}
在使用 sleep()
函数时,将会使当前线程或者进程暂停指定的时间,以便给其他进程或线程执行机会,同时也可以用来控制程序的运行速度。
虽然 sleep()
函数很简单,但是需要注意以下几点:
sleep()
的精度并不高,它所挂起的时间可能会略微超过要求的时间。sleep()
函数是阻塞式的,即在调用sleep()
函数期间,该进程不能进行任何其他操作,包括响应信号等。- 在使用
sleep()
函数期间,如果发生信号,那么sleep()
函数将被中断,该进程将继续运行。
#include <stdio.h>
#include <Windows.h>
int main()
{
printf("Start sleeping...\n");
Sleep(5000); // 暂停 5 秒钟
printf("Wake up!\n");
return 0;
}
由于 Sleep()
函数是阻塞式的,因此该函数调用期间,当前线程将被阻塞。在函数调用结束后,该线程将恢复运行。
在 Windows
系统下使用 Sleep()
函数时,需要注意以下几点:
Sleep()
函数以毫秒为单位指定时间,精度比sleep()
函数更高。- 在调用
Sleep()
函数期间,当前线程将被阻塞,不能进行任何其他操作,包括响应信号等。 - 在使用
Sleep()
函数期间,如果发生信号,那么Sleep()
函数将被中断,该线程将继续运行。
1.3 运行结果
2. sopen
2.1 函数说明
函数声明 | 函数功能 |
---|---|
int sopen(const char* filename, int access, int sharemode, int shflag, ...); |
它是 Microsoft Visual C++ 中的一个函数,用于打开文件并返回文件句柄。与标准库中的 fopen 函数不同,sopen 函数支持以二进制方式打开文件,并且可以指定文件读写方式、共享模式和文件访问权限等参数。 |
参数:
- filename : 要打开的文件名
- access : 指定文件的访问方式,可以是以下值之一:
_O_RDONLY
:只读方式打开文件_O_WRONLY
:只写方式打开文件_O_RDWR
:读写方式打开文件_O_APPEND
:在文件末尾追加数据_O_CREAT
:如果文件不存在,则创建文件_O_TRUNC
:如果文件已存在,清空文件内容_O_EXCL
:与_O_CREAT
配合使用,如果文件已经存在则打开失败- sharemode : 指定文件共享模式,可以是以下值之一:
_SH_DENYRW
:独占方式打开文件,其他进程不能读取或写入该文件_SH_DENYWR
:共享读取方式打开文件,其他进程不能写入该文件_SH_DENYRD
:共享写入方式打开文件,其他进程不能读取该文件_SH_DENYNO
:共享方式打开文件,其他进程可以读取和写入该文件- shflag : 指定文件属性标志,可以是以下值之一:
_S_IWRITE
:文件可写_S_IREAD
:文件可读- ... : 可选参数。如果指定了
_O_CREAT
参数,则需要指定文件的访问权限
2.2 演示示例
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <sys/stat.h>
#define _SH_DENYNO 0x40
int main()
{
int handle;
char buffer[1024];
// 打开文件并读取数据
handle = sopen("output.bin", _O_RDONLY, _SH_DENYNO, _S_IREAD);
if (handle == -1) {
printf("Failed to open file!\n");
return 1;
}
read(handle, buffer, sizeof(buffer));
printf("File content: %s\n", buffer);
// 关闭文件句柄
close(handle);
return 0;
}
指定文件共享模式,如果没有对应的宏常量,则可以定义如下:
#define _SH_DENYRW 0x10
#define _SH_DENYWR 0x20
#define _SH_DENYRD 0x30
#define _SH_DENYNO 0x40
2.3 运行结果
3. sound
3.1 函数说明
函数声明 | 函数功能 |
---|---|
void sound(int frequency); |
用于发出声音 |
void nosound(void); |
sound 函数会持续发出声音,直到调用 nosound 函数停止 |
参数:
- frequency : 要发出的声音的频率,单位为赫兹(Hz)
3.2 演示示例
#include <stdio.h>
#include <windows.h>
int main() {
printf("Playing sound...\n");
sound(1000); // 发出 1000 Hz 音调
Sleep(5000); // 等待 5 秒钟
nosound(); // 停止发声
printf("Sound stopped.\n");
return 0;
}
Windows 下如果上述出现 error: 'sound' was not declared in this scope
,可以使用如下:
#include <stdio.h>
#include <windows.h>
int main() {
printf("Playing sound...\n");
Beep(1000, 5000); // 发出 1000 Hz 音调,持续 5 秒钟
printf("Sound stopped.\n");
return 0;
}
注意: 在
Windows
平台上建议使用Beep()
函数代替sound()
函数,因为Beep()
函数不需要特殊的硬件支持,并且可移植性更好。
4. spawnl
4.1 函数说明
函数声明 | 函数功能 |
---|---|
int spawnl(int mode, const char *cmdname, const char *arg0, ..., NULL); |
它是在 Windows 平台上使用的函数,用于启动另一个程序,并等待该程序运行结束后再继续执行本程序 |
参数:
- mode : 执行模式,可以为
P_WAIT
或P_NOWAIT
- cmdname : 要执行的程序名称
- arg0: 要传递给程序的命令行参数,以
NULL
结尾
4.2 演示示例
4.2.1 test.c
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
4.2.2 spawnl 演示
#include <process.h>
#include <stdio.h>
int main(void)
{
int result;
// 要执行的程序名和参数列表
const char* cmdname = "test.exe";
const char* arg0 = NULL;
// 执行程序
result = spawnl(P_WAIT, cmdname, cmdname, arg0, NULL);
if (result == -1)
{
perror("Error from spawnl");
exit(1);
}
return 0;
}
如果在使用 spawnl()
函数时遇到了 "Error from spawnl: Invalid argument"
错误,有可能是由于参数传递不正确或要执行的程序不存在等原因导致的。
以下是一些可能导致该错误的情况:
- 要执行的程序不存在或路径不正确。
cmdname
参数包含非法字符或格式不正确。- 参数列表没有以
NULL
结尾。 - 要执行的程序需要管理员权限,但当前用户没有足够的权限。
4.3 运行结果
5. spawnle
5.1 函数说明
函数声明 | 函数功能 |
---|---|
int spawnle(int mode, const char *cmdname, const char *arg0, ..., const char *envp[]); |
它是在 Windows 平台上使用的函数,可以启动另一个程序,并通过指定的环境变量传递参数 |
参数:
- mode : 执行模式,可以为
P_WAIT
或P_NOWAIT
- cmdname : 要执行的程序名称
- arg0 : 要传递给程序的命令行参数,以
NULL
结尾- envp : 要传递给程序的环境变量
5.2 演示示例
5.2.1 SubEnvTest.c
#include <process.h>
#include <processenv.h>
#include <stdio.h>
int main(int argc, char *argv[], char **envp)
{
printf("SubEnvTest Command line arguments:\n");
for (int i=0; i<argc; i++)
printf("[%d] : %s\n", i, argv[i]);
printf("exec %s, Hello, %s\n", argv[0], argv[1]);
for (int i = 0; envp[i] != NULL; i++)
{
printf("%s\n", envp[i]);
}
return 0;
}
5.2.2 spawnle 演示
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
int main(int argc, char *argv[], char *envp[]) {
int result;
// 启动 SubEnvTest.exe,并传递当前环境变量
result = spawnle(P_WAIT, "SubEnvTest.exe", "SubEnvTest.exe", NULL, envp);
if (result == -1) {
printf("Error: %d\n", errno);
return 1;
}
return 0;
}
5.3 运行结果
6. sprintf
6.1 函数说明
函数声明 | 函数功能 |
---|---|
int sprintf(char *str, const char *format, ...); |
用于将格式化的字符串输出到指定的缓冲区中 |
参数:
- str : 指向字符数组(缓冲区)的指针,用于存储生成的格式化字符串
- format : 用于指定要生成的格式化文本
- ... : 用于填充格式化字符串中的占位符
6.2 演示示例
#include <stdio.h>
int main() {
char buffer[128];
int value = 123;
// 将整数转换为字符串并保存到 buffer 中
sprintf(buffer, "The value is %d.", value);
printf("%s\n", buffer);
return 0;
}
6.3 运行结果
7. snprintf
7.1 函数说明
函数声明 | 函数功能 |
---|---|
int snprintf(char *str, size_t size, const char *format, ...); |
用于将格式化的字符串输出到指定的缓冲区中,类似于 sprintf 函数,但它可以限制输出字符串的长度,避免缓冲区溢出 |
参数:
- str : 指向字符数组(缓冲区)的指针,用于存储生成的格式化字符串
- size : 指定缓冲区可写入的最大字节数
- format : 用于指定要生成的格式化文本
- ... : 用于填充格式化字符串中的占位符
7.2 演示示例
#include <stdio.h>
int main() {
char buffer[5];
int value = 123456;
// 将整数转换为字符串并保存到 buffer 中,最大可写入长度为 sizeof(buffer) - 1
snprintf(buffer, sizeof(buffer), "%d", value);
printf("%s\n", buffer); // 输出 "1234"
return 0;
}
7.3 运行结果
8. sqrt,sqrtf,sqrtl
8.1 函数说明
函数声明 | 函数功能 |
---|---|
double sqrt(double x); |
计算 x 的平方根(double) |
float sqrtf(float x); |
计算 x 的平方根 (float) |
long double sqrtl(long double x); |
计算 x 的平方根 (long double) |
参数:
- x : 要计算平方根的数
8.2 演示示例
#include <stdio.h>
#include <math.h>
int main() {
double x = 2.0;
float y = 3.0f;
long double z = 4.0L;
printf("sqrt(%.1f) = %.2f\n", x, sqrt(x));
printf("sqrtf(%.1f) = %.2f\n", y, sqrtf(y));
printf("sqrtl(%.1Lf) = %.2Lf\n", z, sqrtl(z));
return 0;
}
8.3 运行结果
9. srand
9.1 函数说明
函数声明 | 函数功能 |
---|---|
void srand(unsigned int seed); |
用于初始化伪随机数生成器 |
参数:
- seed : 用于设置伪随机数生成器的种子值。不同的种子值会产生不同的随机数序列。
9.2 演示示例
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int i;
// 使用当前时间作为种子值
srand(time(NULL));
// 生成 10 个随机数并输出到控制台
for (i = 0; i < 10; i++) {
printf("%d ", rand());
}
printf("\n");
return 0;
}
注意: 如果不设置种子值,则每次程序运行时都会得到相同的随机数序列。因此,我们在实际开发中,常常使用时间戳或其他随机值来作为种子值,以确保生成的随机数具有更好的随机性。
9.3 运行结果
10. sscanf
10.1 函数说明
函数声明 | 函数功能 |
---|---|
int sscanf(const char *str, const char *format, ...); |
用于从字符串中读取数据并进行格式化转换 |
参数:
- str : 要读取数据的字符串
- format : 格式字符串,用于指定要读取的数据的类型、数量和顺序
- ... : 指向要写入的变量的指针
10.2 演示示例
#include <stdio.h>
int main() {
char str[] = "hello world 123";
char buf[16];
int num;
// 从字符串中读取一个字符串和一个整数
if (sscanf(str, "%s %*s %d", buf, &num) == 2) {
printf("String: %s\n", buf);
printf("Number: %d\n", num);
}
return 0;
}
在上述的示例代码中,我们使用 sscanf()
函数从字符串 "hello world 123"
中读取一个字符串和一个整数,并输出到控制台。
注意: 在格式字符串中,
%s
表示读取一个字符串,%d
表示读取一个整数。另外,%*s
表示读取并忽略一个字符串。