替换所有制表符的代码,如果一个空格超过 1 个空格?

标签 c

这个问题在K&R ,练习 1.9。我写了下面的代码:

#include<stdio.h>
main()
{
    int c,i=0,n=0;
    while((c=getchar())!=EOF)
    {
         if(c!=' '||c!='\t')
         {
             i=0;
             putchar(c);
         }
         else if(c==' '||c=='\t')
         {
              i++
         }
         if((c+1)!=' '||(c+1)!='\t')
               n=i;
         if(n!=0)
        {
               c=' ';
               putchar(c);
        }
    }
}

但我无法获得所需的输出。我在 ubuntu 中使用 gcc。当我输入类似 hello\t\ta 的内容时,我的输出是 hello\_\_a 即制表符数被空格数替换,当我输入 hello\_\_a 然后我的输出与输入相同。

请帮助我或建议我一些新的东西以获得所需的输出。

最佳答案

与其给你完整的工作计划,我更愿意引导你走向正确的方向。

首先,c+1 并不表示“输入中的下一个字符”。它只是将 1 添加到 c 的值,这有效地将 c 转换为 ASCII table 中的下一个字符。 . 比如c'a'c+1就是'b',也就是下一个字符int ASCII table , 如果 c 是表中代码为 32 的 ' ' (单个空格),则 c+1 '!' 在表中有一个代码 33。

好吧,要获得下一个角色,您需要阅读它!以同样的方式阅读第一个字符。实现此目的的最佳方法是始终保留先前读取的字符,并与当前读取的字符进行核对。

因此您需要两个变量,例如cpc。您读取字符并将其存储在 c 中。起初,pc'\0'。如果读取的字符不是空格或制表符,则将其写入输出。如果它是制表符,则将其更改为空格。如果是空格,则检查前一个字符 (pc)。如果不是空格,打印c。在循环结束时,您应该将 c 的值存储到 pc 中,这意味着您保存了 pc 中的前一个字符。

我想我已经告诉您完整的解决方案了!

关于替换所有制表符的代码,如果一个空格超过 1 个空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14998537/

相关文章:

C代码翻译成MIPS

c - 用于 Delphi ShareMem 应用程序的 GCC dll

c - 在中断处理程序中将数据从内核缓冲区移动到用户空间缓冲区

c - 如何从文件 C 初始化结构体?

c - "Veto"和 "Hard Block"有什么区别?

c - 为什么我的 NDIS 筛选器驱动程序的 FilterReceiveNetBufferLists 处理程序未被调用?

c - c 中是否有一个函数可以复制 char 数组的特定部分

c - 函数:char* 与 int 表达式的间接级别不同

c - 这个代码结果是什么?为什么会这样?

c - 为什么我会在这个 C 程序中得到这个运行时错误?请告诉我哪里出了问题