版权声明:可以转载奥 https://blog.csdn.net/Jiajikang_jjk/article/details/86775836
文章目录
【C语言】中文符号(句号,问号,感叹号)作为标识符进行分行处理
一、前言
上一篇博文是针对中文符号:句号,以此来实现换行处理,有很多不完善之处,只是作为记录代码的思想,此篇博文进一步将未完善代码的版本抛出来,以此作为方便以后查阅其中代码思想。在结尾说会说明此版本不足之处
二、环境
Windows
文本文件保存格式:GBK
代码编码格式:GBK
三、代码实现
3.1 实现一
3.1.1 流程图
3.1.2 代码
/*
* @Author: JJK
* @Date: 2019-02-08 17:25:17
* @Last Modified by: JJK
* @Last Modified time: 2019-02-08 17:39:48
* @Code Function:
* 中文符号(句号,问号,感叹号)实现分行
*/
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
bool getIndex(char *str, char *subStr);
int main(int argc, char *argv[])
{
char str[1024];
char resultStr[1024][1024]; // 创建一个二维数组
int index, dataLen, preIndex;
int resultNum;
char *f1 = argv[1]; // 后台参数
FILE *fp1 = fopen(f1, "r"); // 创建文件指针及打开文本文件
if (fp1 == NULL)
{
printf("文件 %s 打开时发生错误", f1);
return -1;
}
while (fgets(str, sizeof(str), fp1)) // 按行读取文件
{
index = 0;
dataLen = 0;
preIndex = 0;
resultNum = 0;
while (index < strlen(str)) // 循环以'\n'为代表的每行
{
// 调用自定义函数
if (getIndex(&str[index], "?") || getIndex(&str[index], "。") || getIndex(&str[index], "!")) // 函数成立
{
int len = index - preIndex; // 中文字符的长度
memcpy(resultStr + (dataLen++), &str[preIndex], len); // 复制第二个形参到第一个形参中,复制长度:len
resultNum++;
*(*(resultStr + (dataLen - 1)) + len) = '\0';
preIndex = index + strlen("?"); // 中文字符的长度+
index += strlen("?");
}
else
{
index++;
}
} // 判断结束
for (int i = 0; i < resultNum; i++)
{
printf("%s\n", resultStr + i);
}
}
fclose(fp1);
return 0;
}
// 子函数
bool getIndex(char *str, char *subStr)
{
int count = 0; // 标识符
for (int i = 0; i < strlen(subStr); i++) // 遍历标点符号的长度
{
if (*(str + i) == *(subStr + i)) // 判断是否相等
{
count++; // 累加到
}
}
return strlen(subStr) == count ? true : false; // 判断是否是中文字符的长度
}
3.1.3 原文本文件
3.1.4 结果
3.1.5 说明
1:此代码实现的思想特别好
2:在功能需求有很大不足之处,对于原文本文件只能读取有表示符号的内容,对于未有表示符号的一概不读取。
3:倘若是多个连续的标识符符号出现的时候,也不能进行处理达到满意效果
3.2 实现二
3.2.1 代码
/*
* @Author: JJK
* @Date: 2019-02-08 17:25:17
* @Last Modified by: 贾继康
* @Last Modified time: 2019-02-08 21:43:17
* @Code Function:
* 中文符号(句号,问号,感叹号)实现分行
*/
//句号 -95,-93
//感叹号 -93,-95
//问号 -93,-65
//换行是10
#include <stdio.h>
int main()
{
FILE *read = fopen("./wenben/wenben.txt", "r");
FILE *write = fopen("./wenben/wenbentest2.txt", "w");
char a = fgetc(read);
char b = fgetc(read);
while (a != EOF)
{
if (a >= 0 && a <= 127 && a != 10)// ascii码:0-127
{
fputc(a, write);
fseek(read, -1, SEEK_CUR);// 指针移动到离文件当前位置后一个位置
a = fgetc(read);
b = fgetc(read);
}
else if (a == 10)
{
// fputc(10, write);
fseek(read, -1, SEEK_CUR);
a = fgetc(read);
b = fgetc(read);
}
else if ((a == -95 && b == -93) || (a == -93 && b == -95) || (a == -93 && b == -65))
{
fputc(a, write);
fputc(b, write);
fputc(10, write);
a = fgetc(read);
b = fgetc(read);
// 连续下一个是中文字符:指针移动,不进行其他操作
while ((a == -95 && b == -93) || (a == -93 && b == -95) || (a == -93 && b == -65))
{
a = fgetc(read);
b = fgetc(read);
}
}
else
{
fputc(a, write);
fputc(b, write);
a = fgetc(read);
b = fgetc(read);
}
}
fclose(read);
fclose(write);
return 0;
}
3.2.2 文本文档内容
3.2.3 结果
3.2.4 说明
此程序也是一个有缺陷的程序,譬如光标在原文本中只能停留在文本内容末尾处,此程序只能写入到文本中,没能打印到控制台也是极其不方便的。