我正在尝试解决K& R书第2版的练习1.9,我将在这里写下练习,然后解释我认为我需要做什么,然后,我的代码和我的疑惑。
练习:
编写一个程序将其输入复制到其输出中,用一个空格替换一个或多个空格的每个字符串。
据我所知,我需要使用之前章节中学到的内容制作程序。
我的观点是,我需要找到一种方法,用C的语言说,当出现多个空白后跟另一个空白时,它会给我一个只有一个空白的短语。但我怎么能对电脑说呢?
#include <stdio.h>
/* ToDo - make a program where when the user input a phrase or
* something that contains more than one blank followed by another
* it will transform the input with only one blank */
int main()
{
int c, b;
b = ' ';
while ((c = getchar()) != EOF){ /*don't need explanation*/
/*my doubts start here , how can i say more than one blank ?*/
/* or how can i say if the getchar has one blank followed by another ?*/
if (c == +b) /* trying to say if the getchar has more than one blank but i think this is not correct*/
c = b; /*then it will turn in only one blank*/
}
putchar(c);
}
答案 0 :(得分:2)
这个想法是这样的:
伪代码:
while ((c = getchar()) != EOF)
{
// c contains the character we've just read
if (c is blank and the previous read char is blank)
{
// do nothing
continue;
}
putchar(c); // print that char
copy c to previous char
}
答案 1 :(得分:1)
打印你遇到的每一个角色,包括空白,但当你遇到一个空白时,什么都不做,直到遇到非空白,然后打印出来。重复直到EOF。
在ANSI C中:
#include <stdio.h>
main()
{
int c;
while ((c = getchar()) != EOF) {
putchar(c);
if (c == ' '){
while ((c = getchar()) == ' ')
;
putchar(c);
}
}
}
输入和输出示例:
asd asd 2
asd asd 2
Hello I AM space
Hello I AM space
答案 2 :(得分:1)
老问题,但因为我刚刚解决了这个练习,我想在这里分享它:
#include <stdio.h>
int
main()
{
int c, nspaces;
nspaces = 0;
c = getchar();
while(c != EOF) {
if (c == ' ') {
if (nspaces > 0) {
++nspaces;
} else {
putchar(c);
++nspaces;
}
} else {
putchar(c);
nspaces = 0;
}
c = getchar();
}
return(0);
}
对于我的解决方案,我只有一个计数器,可以跟踪找到多少个连续的空白字符。仅当nspaces为0时,才会将c打印回终端。查找非空格字符会将n空间重置为0.使用此方法无需跟踪前一个字符或多次调用getchar()。
答案 3 :(得分:1)
这是Jabberwocky伪代码的实现。如果您尝试自己实现Jabberwocky的伪代码,请阅读,因为它可以带来更好的学习体验:
#include <stdio.h>
int main()
{
int c, p;
while ((c = getchar()) != EOF)
{
if (c == ' ' && p == ' ')
{
continue;
}
putchar(c);
p = c; /* copy to c to p to track previous character */
}
return 0;
}
答案 4 :(得分:0)
好。如果我错了,请纠正我
&#34; ex)编写一个程序将其输入复制到其输出中,用一个空格替换一个或多个空格的每个字符串。&#34;
据我了解,你必须: - 获取输入
如果有多个空白(可以是空格,&#39; \ t&#39;或其他任何人,ascii),则清除输入
- 打印已清除的字符串
-return
我不会解释如何接受输入,只使用main的参数。
然后你必须检查空白。
只需将计数器递增到第一个空白位置,然后检查下一个是否为空白。 如果是,只需保持递增,如果不是,则将char复制到新的char *。
返回那个char *(请不要在一个函数中完成这一切)。
打印出来。
返回0。
答案 5 :(得分:0)
#include<stdio.h>
int main(int argc, char* argv[])
{
char c = 0;
char prevchar = 0;
while((c = getchar()) != '\n')
{
if(c != ' ' || prevchar != ' ')
putchar(c);
prevchar = c;
}
}
这样做:声明第二个var作为排序单个字符缓冲区来检查前一个字符是否是空格。然后if确保putchar只有在它们不是空格时才会触发。您可以将'\ n'更改为EOF我在这里使用'\ n',因此它只会在下次返回时读取。
答案 6 :(得分:0)
#include<stdio.h>
int main()
{
int i,nb=0;
char sent[100];
printf("Enter a sentence: ");
for(i=0;(sent[i]=getchar())!='\n';i++)
{
if(sent[i]==' ')
{
nb++;
if(nb>=2)
{
i--;
nb--;
}
}
if(sent[i]!=' ')
nb=0;
}
sent[i]='\0';
printf("\nResult: ");
for(i=0;sent[i]!='\0';i++)
{
putchar(sent[i]);
}
return 0;
}
回答同样的问题,我没有使用EOF就这样做了。特别是对于无法使用Ctrl + D&#39;。
的移动用户