首页 > 其他分享 >C语言函数大全-- s 开头的函数(3)

C语言函数大全-- s 开头的函数(3)

时间:2023-04-29 21:32:53浏览次数:28  
标签:return 函数 -- C语言 char int printf include

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() 函数很简单,但是需要注意以下几点:

  1. sleep() 的精度并不高,它所挂起的时间可能会略微超过要求的时间。
  2. sleep() 函数是阻塞式的,即在调用 sleep() 函数期间,该进程不能进行任何其他操作,包括响应信号等。
  3. 在使用 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() 函数时,需要注意以下几点:

  1. Sleep() 函数以毫秒为单位指定时间,精度比 sleep() 函数更高。
  2. 在调用 Sleep() 函数期间,当前线程将被阻塞,不能进行任何其他操作,包括响应信号等。
  3. 在使用 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_WAITP_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" 错误,有可能是由于参数传递不正确或要执行的程序不存在等原因导致的。

以下是一些可能导致该错误的情况:

  1. 要执行的程序不存在或路径不正确。
  2. cmdname 参数包含非法字符或格式不正确。
  3. 参数列表没有以 NULL 结尾。
  4. 要执行的程序需要管理员权限,但当前用户没有足够的权限。

4.3 运行结果

在这里插入图片描述

5. spawnle

5.1 函数说明

函数声明 函数功能
int spawnle(int mode, const char *cmdname, const char *arg0, ..., const char *envp[]); 它是在 Windows 平台上使用的函数,可以启动另一个程序,并通过指定的环境变量传递参数

参数:

  • mode : 执行模式,可以为 P_WAITP_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 表示读取并忽略一个字符串。

10.3 运行结果

在这里插入图片描述

标签:return,函数,--,C语言,char,int,printf,include
From: https://blog.51cto.com/huazie/6236900

相关文章

  • 理解项目成功和失败
        在普通工程师眼中,三重制约因素并不同等重要。对许多工程师而言,范围尤其技术性能比时间和成本明显更重要。项目成功是客户满意或客户验收。对于一些客户和承包商,与客户满意相比,时间和成本无关紧要。可交付成果延期或超预算肯定好过根本没有可交付成果。时间和成本对客户......
  • 物联网基础知识1
    1.万物互联:贯穿于互联网的信息采集、信息传输、信息处理。2.物联网的概念最早由MITAuto-ID中心Ashton教授于1999年在研究射频识别(RFID)时提出。3.国际电信联盟(ITU):无所不在的“物联网”通信时代即将来临,世界上所有的物体,可以通过因特网主动进行信息交换,横向领域:覆盖普适计算机、传......
  • 物联网基础知识1
    1.万物互联:贯穿于互联网的信息采集、信息传输、信息处理。2.物联网的概念最早由MITAuto-ID中心Ashton教授于1999年在研究射频识别(RFID)时提出。3.国际电信联盟(ITU):无所不在的“物联网”通信时代即将来临,世界上所有的物体,可以通过因特网主动进行信息交换,横向领域:覆盖普适计算机、传......
  • DVT_eclipse学习笔记1
    常用方法1.自动补全快捷方式:alt+/(可以多次按这个“/”选择补全的东西)自动补全有时候会包含许多提案,分为几类:第一个是你可以在范围内访问的内容(信号、变量、方法等,取决于所包含的范围)alt+/第二个用于代码模板alt+/+/第三个是其他的东西,例如模块实例alt+/+/+/2.快速修......
  • 3.子查询
    1、查询从来没有借过书的读者姓名。(分别使用notin、notexists和连接查询三种写法实现,体会写法的不同之处)--方式1:notinSELECTreaderNameFROMReaderWHEREreaderNonotin(SELECTreaderNoFROMBorrow);--方式2:notexistsSELECTreaderNameFROMReaderaWHERE......
  • Problem I: 实现一种电厂小型实时数据库系统
    ProblemDescription电厂控制系统的设备有很多监测点,监测点的传感器将监测到的实时数据传送到厂级监控中心,使工程师能方便的分析电厂设备的运行状态。厂级监控中心需要将这些数据存入数据库(INSERT),并且能查询(QUERY),修改(MODIFY),删除(DELETE)这些数据。这些数据只有两种类型:模拟量(AI,浮......
  • linux c/c++程序集成python库,实现调用python函数
    为了提高开发效率,扩展开发程序的功能,我们经常会在我们的linuxc/c++进程里调用外部脚本,例如lua、python,下面,介绍下如何在自己的linuxc/c++代码里调用python脚本里的函数和类,并且将python库集成到我们自己的进程目录里,这样就不依赖系统环境是否存在python及其版本要求。 ......
  • 03、信息风险评估
    风险评估的最终目标是使组织管理人员能够确定适当的安全预算,并在该预算范围内实施安全控制以优化保护级别。这一目标,可以通过定量风险分析或定性风险分析以及其他风险分析方法进行。在风险评估过程中如果规模过大、过分强调量化评估,项目回变得庞大、复杂且难以进行审查,并且还可能......
  • Fastjson检测和利用
    漏洞检测:`DNSlog{"@type":"java.net.InetAddress","val":"dnslog.cn"}在49以下才能触发,因为这个gadget在49被禁止了,可用于检测具体版本{"@type":"java.net.Inet4Address","val":"dnslog"}{"@type":"......
  • Java学习2——第四-六次题目集的分析与总结
     一.前言 本次Blog是对java学习中第二阶段练习的一个总结,作为刚学习JAVA的小白,以下依旧只是本人作为普通学生,以当前能力和状态所做出的总结和分析,不足之处也欢迎各位大佬的指正! 这次的三个题目集,题量除了题目集六很少外,其它都是正常数量,当然题目集六的题也是最难的。总体难......