C语言skipwhitespace函数如何实现?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 C语言 正文

在C语言中,并没有一个名为 skipwhitespace 的标准库函数,这个名称通常是一个自定义函数,用于跳过字符串或输入流中的空白字符(如空格 、制表符 '\t'、换行符 '\n'、回车 '\r'、垂直制表符 '\v' 和换页符 '\f')。

c语言skipwhitespace
(图片来源网络,侵删)

下面我将为你展示几种常见的 skipwhitespace 函数实现,并解释它们的使用场景。


跳过字符串中的空白字符

这是最常见的实现方式,通常用于处理从文件或用户输入中读取的字符串。

函数原型

/**
 * @brief 跳过字符串开头的空白字符
 * @param str 指向字符串的指针,该指针会被修改以指向第一个非空白字符
 * @return 指向第一个非空白字符的指针,如果字符串为空或全为空白字符,则返回 NULL
 */
char* skipwhitespace(char* str);

函数实现

#include <ctype.h> // 用于 isspace 函数
char* skipwhitespace(char* str) {
    if (str == NULL) {
        return NULL;
    }
    // isspace 检查字符是否为空白字符
    // 只要当前字符是空白字符,指针就向后移动
    while (*str != '\0' && isspace((unsigned char)*str)) {
        str++;
    }
    // 如果到达字符串末尾,说明全是空白字符,返回 NULL
    // 否则,返回指向第一个非空白字符的指针
    return (*str == '\0') ? NULL : str;
}

代码示例

#include <stdio.h>
#include <ctype.h>
char* skipwhitespace(char* str);
int main() {
    char str1[] = "   Hello, World!"; // 前面有空格
    char str2[] = "\t\n\rTest String"; // 前面有各种空白符
    char str3[] = "NoLeadingSpace";    // 前面没有空白符
    char str4[] = "   \t\n";          // 全是空白符
    char str5[] = "";                 // 空字符串
    char* p1 = skipwhitespace(str1);
    char* p2 = skipwhitespace(str2);
    char* p3 = skipwhitespace(str3);
    char* p4 = skipwhitespace(str4);
    char* p5 = skipwhitespace(str5);
    printf("Original str1: \"%s\"\n", str1);
    printf("Skipped str1: \"%s\"\n\n", p1 ? p1 : "(NULL)");
    printf("Original str2: \"%s\"\n", str2);
    printf("Skipped str2: \"%s\"\n\n", p2 ? p2 : "(NULL)");
    printf("Original str3: \"%s\"\n", str3);
    printf("Skipped str3: \"%s\"\n\n", p3 ? p3 : "(NULL)");
    printf("Original str4: \"%s\"\n", str4);
    printf("Skipped str4: \"%s\"\n\n", p4 ? p4 : "(NULL)");
    printf("Original str5: \"%s\"\n", str5);
    printf("Skipped str5: \"%s\"\n", p5 ? p5 : "(NULL)");
    return 0;
}

输出

Original str1: "   Hello, World!"
Skipped str1: "Hello, World!"
Original str2: "    
    Test String"
Skipped str2: "Test String"
Original str3: "NoLeadingSpace"
Skipped str3: "NoLeadingSpace"
Original str4: "    
"
Skipped str4: "(NULL)"
Original str5: ""
Skipped str5: "(NULL)"

跳过输入流(如 stdin)中的空白字符

这种实现用于从标准输入(通常是键盘)或文件中读取数据,并丢弃开头的所有空白字符。

函数原型

#include <stdio.h>
/**
 * @brief 从标准输入流中跳过所有空白字符
 * @return 无
 */
void skipwhitespace_stream();

函数实现

#include <stdio.h>
#include <ctype.h>
void skipwhitespace_stream() {
    int c;
    // 使用 int 而不是 char 来正确处理 EOF
    // 只要读取到的字符是空白字符,就继续读取并丢弃
    while ((c = getchar()) != EOF && isspace((unsigned char)c)) {
        // 循环体为空,只做读取和判断
    }
    // 读取到第一个非空白字符或EOF后,将其放回流中,以便后续操作
    if (c != EOF) {
        ungetc(c, stdin);
    }
}

代码示例

#include <stdio.h>
#include <ctype.h>
void skipwhitespace_stream();
int main() {
    printf("Please enter some text, starting with whitespace characters (e.g., '   hello'):\n");
    // 调用函数跳过空白字符
    skipwhitespace_stream();
    printf("Now, reading the first non-whitespace character: ");
    char first_char = getchar();
    printf("You entered: '%c'\n", first_char);
    // 读取并丢弃该字符后面的内容,直到换行
    while (getchar() != '\n') {
        // 丢弃字符
    }
    return 0;
}

运行示例

Please enter some text, starting with whitespace characters (e.g., '   hello'):
   World
Now, reading the first non-whitespace character: W
You entered: 'W'

跳过字符串中间的连续空白字符

有时我们可能需要将字符串中连续的多个空白字符缩减为一个,这通常用于规范化字符串格式。

c语言skipwhitespace
(图片来源网络,侵删)

函数原型

/**
 * @brief 将字符串中连续的空白字符缩减为一个空格
 * @param str 要处理的字符串,原地修改
 */
void normalize_whitespace(char* str);

函数实现

#include <ctype.h>
void normalize_whitespace(char* str) {
    if (str == NULL) {
        return;
    }
    char *dest = str; // 指向当前写入位置
    char *src = str;  // 指向当前读取位置
    int in_whitespace = 0; // 标记是否处于连续空白字符中
    while (*src != '\0') {
        if (isspace((unsigned char)*src)) {
            // 如果当前是空白字符
            if (!in_whitespace) {
                // 如果之前不在空白字符序列中,说明是第一个空白字符
                *dest++ = ' '; // 写入一个空格
                in_whitespace = 1;
            }
            // 如果已经在空白字符序列中,则跳过当前字符
        } else {
            // 如果当前不是空白字符
            *dest++ = *src; // 直接复制
            in_whitespace = 0; // 重置标记
        }
        src++;
    }
    *dest = '\0'; // 字符串末尾添加终止符
}

代码示例

#include <stdio.h>
#include <ctype.h>
void normalize_whitespace(char* str);
int main() {
    char text[] = "This   is    a    test\t\nwith   \t lots of \r spaces.";
    printf("Original: \"%s\"\n", text);
    normalize_whitespace(text);
    printf("Normalized: \"%s\"\n", text);
    return 0;
}

输出

Original: "This   is    a    test   
with     lots of 
 spaces."
Normalized: "This is a test with lots of spaces."

函数名 功能 参数 返回值 依赖头文件
skipwhitespace 跳过字符串开头的空白字符 char* 指向第一个非空白字符的指针 ctype.h
skipwhitespace_stream 跳过输入流(如stdin)的空白字符 stdio.h, ctype.h
normalize_whitespace 将字符串中连续的空白字符缩减为一个 char* 无(原地修改) ctype.h

skipwhitespace 是一个非常实用的辅助函数,在解析配置文件、处理用户输入、数据清洗等场景中非常常见,你可以根据具体需求选择或修改上述实现。

c语言skipwhitespace
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
dede文章表weight字段是啥作用?
« 上一篇 今天
WordPress和织梦,哪个更易上手?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]