【C语言】中文符号(句号,问号,感叹号)作为标识符进行分行处理

版权声明:可以转载奥 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 说明

       此程序也是一个有缺陷的程序,譬如光标在原文本中只能停留在文本内容末尾处,此程序只能写入到文本中,没能打印到控制台也是极其不方便的。

扫描二维码关注公众号,回复: 5474806 查看本文章

猜你喜欢

转载自blog.csdn.net/Jiajikang_jjk/article/details/86775836