c - 如何在Linux中的c中读取文件中没有不可见字符的每5位数字?
问题描述
我想每 5 个字符读取一次,但是当我打印输出时,我得到的字符少于 5 个,因为源文件中有不可见的字符。我怎样才能跳过它们?
for(int i=0; i<sizeof(buf);i++){
// perform some operation
}
printf("%s",buf);
解决方案
isspace
定义了一个有用的函数,ctype.h
可以准确检查您要问的内容 - char 是否为空格。
那里还定义了几个额外的有趣的字符分类功能(更多信息):
int isalnum(int c);
int isalpha(int c);
int iscntrl(int c);
int isdigit(int c);
int isgraph(int c);
int islower(int c);
int isprint(int c);
int ispunct(int c);
int isspace(int c);
int isupper(int c);
int isxdigit(int c);
int isascii(int c);
int isblank(int c);
事实上,有 3 类函数可以对字符进行分类,用于字节字符串、宽字符串和多字节字符串
对于您的示例,使用语言环境避免任何类型的空格en_US.UTF-8
:
#include <stdio.h>
#include <ctype.h>
#include <locale.h>
#include <string.h>
int main(void)
{
unsigned char * BUF = " a\vb\nc d\tefghijk";
setlocale(LC_ALL, "en_US.UTF-8");
for (int i = 0, c = 5; i < strlen(BUF) && c > 0;++i){
unsigned char chr = BUF[i];
if (isspace(chr))
continue;
printf("%c", chr);
c--;
}
printf("\n");
}
不要忘记这些功能取决于编码。对于不同的编码,相同的字符可能有不同的分类。
推荐阅读
- c++ - C ++:强制lamba实例具有唯一的静态变量
- vue.js - Vuejs 以反应方式更新列表
- android - 如何计算文本字段中有多少行?
- php - invalidargumentexception credentials.json" 不存在
- laravel - 提交后如何从弹出窗口中清空输入字段-Vue-laravel?
- c++ - 使用 unordered_map 确定两个字符串是否是字谜
- sql - 过程在触发器中不起作用。没有触发器,系统程序可以正常工作
- c# - 获取错误 Year、Month 和 Day 参数描述了无法表示的 DateTime 异常
- c# - NAudio 不向我的耳机输出声音,只向我的扬声器输出声音
- c# - 在一条线上画一个圆圈