【问题标题】:How do I store repeated null characters in a string in C from fgetc?如何从fgetc将重复的空字符存储在C中的字符串中?
【发布时间】:2020-05-23 23:01:38
【问题描述】:

编辑: 这根本不能可靠地处理字符串。我已更改整个系统以使用 int 数组。也消除了许多其他令人头疼的问题。我的 MVC 的工作版本是:

#include <stdio.h>
#include <string.h>

int main (){
    int nextChar;
    int augmented[256];
    int index = 0;
    while ((nextChar = fgetc(stdin)) != EOF){
        augmented[index] = nextChar;
        index++;
    }
    for (int i = 0; i <= index;++i){
        printf("%c", augmented[i]);
    }
}

结束编辑

原帖:

我正在尝试为作业实施 LZW 压缩器。到目前为止,一切都在文本上运行良好,但如果输入文件包含大量空字符,我就会扔掉垃圾。

在开始时,我将传入的 char 存储为 int 以检查 EOF,然后将其转换为 char 以连接到我的增强字符串以进行字典比较。我已经在每个文件之后打印出我的字典,发现长时间运行的零我的字典条目是一个空字符串。

我认为发生的事情是它需要一串零并使其成为单个零。不是所需的值。我需要把所有这些零都去掉。

我制作了一个最小的可行代码来显示错误,并发现它发生在铸造阶段。如何构建一个空字符检查,以便我可以用它来替换可以存储在字符串中的其他内容?

#include <stdio.h>
#include <string.h>

int main (){
    int nextChar;
    char augmented[256] = "\0";
    while ((nextChar = fgetc(stdin) != EOF)){
        char charBuffer[2];
        sprintf(charBuffer, "%c", nextChar);
        strcat(augmented, charBuffer);
    }
    printf("%s",augmented);
}

我已经搜索了几天,我想我似乎无法弄清楚正确的查询应该是什么,因为我没有找到任何有用的结果。

【问题讨论】:

  • 如果数据包含零,那么使用字符串函数就不会顺利进行。您最好将索引保存到augmented[] 并直接写信给它,而不是绕着房子走。
  • 这让我走上了正轨。我放弃了所有字符串,并在 int 数组上完成了整个工作。
  • 关于:while ((nextChar = fgetc(stdin)) != EOF){ augmented[index] = nextChar; index++; } 此代码允许在augumented[256] 中存储无限数量的字符但是,该数组只有 256 个字节长。建议:while ( index &lt; sizeof( augmented ) &amp;&amp; (nextChar = fgetc(stdin)) != EOF){ augmented[index] = nextChar; index++; }

标签: c string null stdin fgetc


【解决方案1】:

问题是括号。改为:

while ((nextChar = fgetc(stdin)) != EOF){

您的代码将fgetc(stdin)) != EOF 的比较值分配给nextChar

您还应该将charBuffer 初始化为零。

【讨论】:

  • 是的,这绝对是个问题。但这只是在我发布的代码 sn-p 中。在实际代码中,它与您定义的一样。接得好!谢谢!但是仍然不能解决空问题。
【解决方案2】:

这里是您的程序的一些更新。 0 转换为 '0'。不完全确定您在寻找什么,但希望这能让您指出正确的方向:

#include <stdio.h>
#include <string.h>

int main (){
    int nextChar;
    char augmented[256] = {0}; // zero entire array
    int i = 0;
    while ((nextChar = fgetc(stdin)) != EOF){
        // convert 0 to some other character
        if( nextChar == 0 ) nextChar = '0';
        augmented[i++] = (char)nextChar;
        //check for buffer overflow
        if( i==255) break;
    }
    printf("%s",augmented);
}

【讨论】:

  • 感谢您的回复。我之前尝试过(现在又尝试过),但似乎没有效果。
  • 这是个好主意,但它会将其转换为 ascii 零。我需要实际的 null 0x00。
  • 然后去掉 if(nextChar==0)nextChar='0'。另请注意,printf 将在第一个 0x00 处停止。
猜你喜欢
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2011-06-16
相关资源
最近更新 更多