函数sscanf 和 snprintf

浅谈函数sscanf 和 snprintf

【每日一题】- leetcode 537. 复数乘法

  • 【思路】虚数构成:a+bi;利用sscanf函数读取实部a和虚部b;再利用snprintf函数将计算后的实部a和虚部b以【%d+%di】输入到字符串中
char * complexNumberMultiply(char * num1, char * num2){
    char *ans = (char*)malloc(sizeof(char)*20);
    int a , b , c, d;
    //读取实部和虚部
    sscanf(num1 , "%d+%di", &a , &b);
    sscanf(num2 , "%d+%di", &c , &d);
    int sum1 = a*c - b*d , sum2 = a*d + b*c;
    //输出实部和虚部
    snprintf(ans, 20 ,"%d+%di", sum1,sum2);
    return ans;
}
  • 浅谈函数sscanf
相同点不同点
scanfsscanf 与 scanf类似,都是用于输入的scanf 以屏幕(stdin)为输入源
sscanfsscanf 与 scanf类似,都是用于输入的sscanf 以目标字符串为输入源

【函数原型】: Int sscanf( string str, string fmt, mixed var1, mixed var2 … );
【使用方式】: snprintf( stdin , format , ans[ ]… , &b… );

stdin表示数据输入源
format读取方式可以是一个或多个符号
ans[ ]… , &b…数据读取方式(如:" %d ")
  • 浅谈函数snprintf
相同点不同点
printfprintf 与 snprintf类似,都是用于输出的printf 函数将数据打印到屏幕上
snprintfprintf 与 snprintf类似,都是用于输入的snprintf 函数将数据读取到目标位置

【函数原型】: int snprintf(char *restrict buf, size_t n, const char * restrict format, …);
【使用方式】: snprintf( buf , n , format , stdin );

buf表示数据保存的位置
format数据读取方式(如:" %d ")
stdin表示数据输入源

【注意】
(1) 如果格式化后的字符串长度 < n,则将此字符串全部复制到buf中,并给其后添加一个字符串结束符(’\0’);
(2) 如果格式化后的字符串长度 >= n,则只将其中的(n-1)个字符复制到buf中,并给其后添加一个字符串结束符(’\0’),不需要考虑溢出的问题,返回值为欲写入的字符串长度。

`snprintf` 和 `snscanf` 分别是用于字符串处理函数,在 C 语言环境中非常有用。 ### `snprintf` `snprintf` 函数主要用于将格式化后的字符串存储到缓冲区中,并提供对输出长度的控制,避免了 `printf` 类函数可能导致的缓冲溢出的风险。该函数通常用于创建字符串输出,例如日志记录、文件输出等场合。 **语法**: ```c int snprintf(char *str, size_t size, const char *format, ...); ``` - **参数**: - `str`: 指向目标字符串缓冲区的指针。 - `size`: 缓冲区的大小。 - `format`: 格式化字符串。 - `...`: 额外的参数用于格式化的字符串。 **返回值**: 返回实际写入的字符数(包括结束符 '\0'),但如果缓冲区太小则返回小于 `size` 的字符数并设置 `errno` 到 `ERANGE`。 **例子**: ```c #include <stdio.h> #include <string.h> int main() { char buffer[50]; snprintf(buffer, sizeof(buffer), "The answer is %d", 42); printf("Buffer content: %s\n", buffer); return 0; } ``` ### `snscanf` `snscanf` 是 `sscanf` 函数的一个变体,它允许读取格式化字符串而不是打印。`snscanf` 主要在需要从输入流中解析数据并将其存储到变量中时使用。它可以有效地解析复杂的输入格式并存储到预定义的变量中,适用于多种类型的输入数据。 **语法**: ```c int snscanf(const char * restrict str, const char * restrict format, ...) ; ``` - **参数**: - `str`: 包含待解析字符串的指针。 - `format`: 用于描述期望解析的格式的字符串。 - `...` : 需要解析到特定内存位置的数据项列表。 **返回值**: 返回成功匹配的格式字符串的数量(不包括终止符),如果失败则返回 `-1` 并设置 `errno`。 **例子**: ```c #include <stdio.h> #include <stdlib.h> int main() { char input[80]; double value; // Read a float from the user. if (snscanf(input, "%lf", &value) == 1) { printf("Parsed value: %.2f\n", value); } else { fprintf(stderr, "Invalid input.\n"); } return 0; } ``` **注意事项**: - 虽然 `snscanf` 可以提供更安全的输入解析方式,但是使用不当仍然可能会导致错误或安全漏洞。始终小心地处理用户输入和错误检查,以防恶意输入或异常情况。 - 使用 `snprintf` 和 `snscanf` 时,确保传给它们的参数正确无误,以避免潜在的程序错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放逐、青春*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值