C语言swprintf函数的正确用法

在这篇文章的开头,我要狠狠的吐槽国内那些专门抄别人文章的网站主们,抄是可以抄,但是一篇错的文章还抄来抄去的有意思吗???

swprintf函数原型:

int swprintf(wchar_t * ws,size_t len,const wchar_t * format,...);

参数说明:

ws

指向存储宽字符串的缓冲区的指针。
缓冲区的大小至少为n个宽字符。

len

填充ws缓冲区的最大宽字符数。
生成的字符串长度至多为n-1,为额外的’0’留一个空间。

format

宽字符串,其中包含格式字符串,其格式与printf中的格式相同。
请注意,所有格式说明符的含义与printf中的相同; 因此,应使用%lc写宽字符(而不是%c),并且%ls应用于宽字符串(而不是%s)。

… (附加参数)

同printf的附加参数,不做过多解释。

程序示例:

#include <stdio.h>
#include <wchar.h>
int main (void) {
    wchar_t str [100] = L"";
    swprintf (str, 100, L"%ls%d is %d",L"The half of " ,80, 80/2);
    fputws (str, stdout);
    return 0;
}

C语言操作文件时写完一组数据后立即刷新缓存区的方法

前言

很多时候,为了防止程序意外结束等原因造成的数据丢失,我们需要在向文件写入一组数据以后立即刷新缓存区。比如说:在写程序LOG的时候,为了防止程序崩溃时无法记录LOG,就需要记录一条LOG就刷新一次缓存区以使其立即写入磁盘文件。

实现方法

使用C标准库提供的fflush(FILE *)函数可以很方便的实现该功能,只需传入要刷新缓存区的文件指针即可。

示例程序

#include <stdio.h>
int main(void) {
    FILE *fp = fopen("LOG.txt", "w");
    fprintf(fp, "hello!");// 使用一个明显小于缓存区的字符串做测试,若大于缓存区则缓存区在满了以后会自动刷新
    fflush(fp);           // 立即刷新缓存区,若删除此语句则字符串不会被保存在文件中。
    fp++;                 // 偏移文件指针到未知地址。
    fclose(fp);           // 由于fp指向未知地址,所以执行fclose后程序会崩溃。
    return 0;
}

经观察可以发现,不使用fflush()函数,字符串就不能被正确的保存在文件中。

原来C语言的数组大小可以是一个变量呀!

长久以来,我一直以为C语言的数组大小必须是在编译前就确定下来的常量值,相信很多C语言初学者也是和我一样的认识。然而,直到今天我才发现原来从C99标准开始C语言就已经支持了可变长数组

例如如下程序(注:VS系列编译器均不支持该特性,搞不懂微软为何不好好支持C99标准):

#include <stdio.h>
int main(void) {
    int a = 2;
    int b[a + 1];   // 数组b的长度只有在运行时才可以确定。
    for (int i = 0; i < 3; i++) {
        b[i] = i;
        printf("%d\n", b[i]);
    }
    return 0;
}

上面的代码在GCC 7.3上测试通过(实际上任何支持C99标准的编译器都可以)。
需要注意的是,在C语言中,可变长数组只能用于局部变量中,在全局变量中使用可变长数组会导致编译器报错。
另外,可变长数组不等于动态数组,也就是说,数组的维度在变量的整个生命周期中是不可变的。
可变长数组对于二维、三维…的数组及类似int (*a)[b/*b是个变量*/ + 2];这种指向二维数组的指针也一样适用。

C语言实现Linux下遍历指定目录批量搜索及替换文件中关键字的小工具

为什么要写这样一个程序呢?

兼职做IDC的我经常会需要帮客户改网站,很多时候会需要将用户网站中所有脚本文件中的某一关键字进行替换(可能是品牌名称、网址等),在Windwos下一般都是用Dreamweaver来实现的,但总有一种杀鸡用牛刀的感觉。后来电脑重装为Linux平台后一直没发现好的批量替换工具,这导致很长一段时间以来我一直是用grep命令先搜索关键字,再挨个文件手工替换=_=。。。
寒假前听说高考科那边要开C语言的课程了,索性就跟着学啦,因为我初中的时候有看过一点点C++的知识,所以C学起来也还算轻松,到放寒假时已经学了两个月了,感觉是时候利用假期来写点什么了。想到前面说的痛点,我就决定写一个小巧的工具,可以方便的批量替换目录中所有文件中包含的关键字。

程序简介

首先声明,这是我写的第一个程序(打印hello, world那种“程序”不算哈),水平有限,若是代码中什么可笑的地方还望大佬们可以给指出来^_^。
程序是用C语言+Shell脚本实现的,目前仅支持Linux平台,计划支持Windows(工作量不会很大,核心代码通用)。
程序中关键字的数据存储是使用链表这种数据结构实现的,没学过链表的同学看起来可能比较吃力。

若是程序中有什么BUG或是想和我交流一下可以在文章下方留言。

程序源码:

GitHub:https://github.com/sunxiyuan/sfind

感觉还可以的话给个Star呗~