如何解决我如何使用putchar来“压缩”字符Ansi-C
|| 我想知道我是否可以为我的代码获得一些帮助。我在下面放了一些部分代码/*reads char by char til EOF*/
while((c = getchar()) != EOF)
{
if(c == \'\\t\')
{
putchar(\' \');
}
else if(c == \' \')
{
putchar(\'d\');
}
else
{
putchar(c);
}
}
我现在想做的是压缩用户输入的空格字符。因此,如果用户输入:
a [空格] [空格] [空格] [空格] [空格] [空格] [空格] [空格] a
输出应该是
a [SPACE] a
现在我已经设置好,它可以替换所有用于d的空格以进行测试。我将如何更改代码,使其仅打印出1个空格,而不是用户放入的所有空格。
感谢您的任何帮助。
解决方法
一种解决方案:
/*reads char by char til EOF*/
int hasspace = 0;
while((c = getchar()) != EOF)
{
if (isspace(c))
hasspace = 1;
}
else
{
if (hasspace)
{
hasspace = 0;
putchar(\' \');
}
putchar(c);
}
}
, 只需保留一个空白标志:
int lastWasSpace = 0;
while((c = getchar()) != EOF) {
if(c == \'\\t\' || c == \' \') { // you could also use isspace()
if(!lastWasSpace) {
lastWasSpace = 1;
putchar(c);
}
} else {
lastWasSpace = 0;
}
}
, 首先,您如何声明c
?:
while((c = getchar()) != EOF)
如果c
是char
,则它不能容纳所有字符和EOF
。确保声明的“ 3”的数据类型大于“ 6”(通常为10)。
接下来,您可以使用廉价的技巧来处理多个空间的压缩:
int space_seen = 0;
while((c = getchar()) != EOF)
{
if(c == \'\\t\')
{
putchar(\' \');
}
else if(c == \' \')
{
if (!space_seen)
{
putchar(\'d\');
space_seen = 1;
}
}
else
{
putchar(c);
space_seen = 0;
}
}
这个技巧也有助于跟踪字符串的解析。
, jcomeau@intrepid:/tmp$ cat compress.c; echo \'this is a test\' | ./compress
#include <stdio.h>
int main() {
int c,lastchar = \'x\';
while ((c = getchar()) != EOF) {
if (c == \'\\t\' || c == \' \') {
if (lastchar != \' \') {
putchar(\' \');
lastchar = \' \';
}
} else {
putchar(c);
lastchar = c;
}
}
}
this is a test
, 记录您何时打印空格,不要再打印它们,直到找到另一个字母为止。
使用您的代码作为基础:
unsigned char space = 0;
/* reads char by char until EOF */
while((c = getchar()) != EOF)
{
if(c == \'\\t\')
{
putchar(\' \');
}
else if(c == \' \')
{
/* state specific action */
if(space == 0) {
putchar(\'d\');
space = 1; /* state transition */
}
}
else
{
/* state transition */
if(space == 1) {
space = 0;
}
putchar(c);
}
}
你去。一个非常非常简单的状态机。那样简单!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。