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

(图片来源网络,侵删)
下面我将为你展示几种常见的 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'
跳过字符串中间的连续空白字符
有时我们可能需要将字符串中连续的多个空白字符缩减为一个,这通常用于规范化字符串格式。

(图片来源网络,侵删)
函数原型
/** * @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 是一个非常实用的辅助函数,在解析配置文件、处理用户输入、数据清洗等场景中非常常见,你可以根据具体需求选择或修改上述实现。

(图片来源网络,侵删)
