用于判断字符结尾的输入流类

此博客展示了Java中CharTerminatedInputStream类的实现代码。该类继承自InputStream,用于处理以特定字符数组终止的输入流。代码包含构造函数、重置方法和读取方法等,对输入流的读取和终止条件进行了详细处理。

import java.io.IOException;
import java.io.InputStream;

public class CharTerminatedInputStream extends InputStream {

  private InputStream in;

  private int match[];

  private int buffer[];

  private int pos = 0;

  private boolean endFound = false;


  public CharTerminatedInputStream(InputStream in, byte[] terminator) {
    if (terminator == null) {
      throw new IllegalArgumentException("The terminating character array cannot be null.");
    }
    if (terminator.length == 0) {
      throw new IllegalArgumentException("The terminating character array cannot be of zero length.");
    }
    match = new int[terminator.length];
    buffer = new int[terminator.length];
    for (int i = 0; i < terminator.length; i++) {
      match[i] = (int) terminator[i];
      buffer[i] = (int) terminator[i];
    }
    this.in = in;
  }


  public synchronized void reset() {
    endFound = false;
    pos = 0;
  }


  public int read() throws IOException {

    if (endFound) {
      return -1;
    }

    if (pos == 0) {
      int b = in.read();
      if (b == -1) {
        endFound = true;
        return -1;
      }
      if (b != match[0]) {
        return b;
      }
      buffer[0] = b;
      pos++;
    } else {
      if (buffer[0] != match[0]) {
        return topChar();
      }
    }
    for (int i = 0; i < match.length; i++) {
      if (i >= pos) {
        int b = in.read();
        if (b == -1) {
          return topChar();
        }
        buffer[pos] = b;
        pos++;
      }
      if (buffer[i] != match[i]) {
        return topChar();
      }
    }
    endFound = true;
    return -1;
  }


  private int topChar() {
    int b = buffer[0];
    if (pos > 1) {
      System.arraycopy(buffer, 1, buffer, 0, pos - 1);
    }
    pos--;
    return b;
  }
}

### C语言中判断字符串输入结束的方法 在C语言中,由于没有内置的字符型,处理字符串通常依赖于字符数组以及标准库 `<string.h>` 中提供的函数。当涉及到判断字符串输入结束时,主要依据的是字符串终止符 `\0` 的存在[^1]。 #### 字符串终止符的作用 在C语言中,字符串是以空字符null character, 即 `\0` 或 ASCII 值为 `0`)作为结尾标志的。这意味着任何有效的字符串都必须以 `\0` 结束。程序通过检测到该字符来确认字符串已到达终点。 #### 输入流中的换行符与EOF 除了依靠内部存储结构中的`\0`外,在交互式输入场景下还需要考虑两种常见情况: - **遇到回车键**:当用户从键盘输入并按下Enter键时,大多数情况下会向缓冲区写入一个换行符(`\n`)而不是立即停止读取过程。 - **文件结束(End Of File)**:对于非交互式的批量数据处理或者管道传输等情况,则可能涉及EOF(end-of-file marker),它表示没有更多可读的数据了。在Unix/Linux系统上可以通过Ctrl+D信号触发;而在Windows平台上则是通过组合按键Ctrl+Z实现。 以下是几种常用方法用于判定何时应视为完成了一次完整的字符串接收: --- #### 使用 fgets 函数 ```c #include <stdio.h> #define MAX_LEN 100 int main() { char str[MAX_LEN]; printf("请输入一行文字:\n"); if (fgets(str, sizeof(str), stdin)) { // 尝试获取至多MAX_LEN-1个字符连同'\n'一起存放到str里 size_t len = strlen(str); if (len > 0 && str[len-1] == '\n') { // 如果最后一个是\n则移除之 str[--len] = '\0'; } puts("您刚刚输入的内容如下:"); puts(str); } else{ perror("无法正常读取"); } return 0; } ``` 上述代码片段展示了如何利用 `fgets()` 来安全地捕获整行输入,并自动包含潜在存在的换行符。之后可以检查这个特定位置上的值是否等于 `\n` ,从而决定进一步清理措施。 --- #### 手动循环读取直到遇见特殊标记 另一种方式是逐字节扫描直至发现预定义条件为止,比如下面的例子演示了一个简单的手动解析流程: ```c #include <stdio.h> void read_until_eof_or_newline(){ int c ; while((c=getchar())!= EOF && c != '\n'){ putchar(c); /* 可选: 实现即时显示效果 */ } } int main(void){ printf("\n等待您的输入...\n"); read_until_eof_or_newline(); return 0; } ``` 这里采用 getchar 不断提取单个ASCII码数值形式表现出来的字母数字及其他符号成分,只要尚未抵达指定界限就持续打印出来形成镜像反馈机制. --- #### 总结注意事项 无论采取何种策略都需要牢记几个要点: - 确保预留足够的空间容纳实际录入的结果加上必要的终结指示器; - 对各种边界状况保持敏感度以便妥善应对异常情形的发生概率; - 避免忽略掉那些隐藏起来却至关重要的控制序列如LF(CR/LF)等.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值