我是编程新手,我决定从c开始。我正在使用K& R,还有这个练习,它要求编写一个程序,将输入复制到输出,用一个空格替换一个或多个空格。然而,当我编写我的程序时(我确信它不正确但是没关系,因为我在这里学习)我想知道我做错了什么。还有一个注意事项:当我用3个空白键入我的名字时,它减少到2个,但是当使用两个或一个空白时,没有任何反应。代码发布在下面
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int c; // getchar value
int blanks = 0; // counting the amount of blanks. If more than one then replace with blanks_2
char blanks_2 = ' '; //character value for replacement in case blanks is more than one
printf("Enter your name please\n");
while((c = getchar()) != EOF){
if(c == ' '){
++blanks;
if (blanks >= 1){
putchar(blankos); }
}
if(c >= 'a' && c <= 'z'){
putchar(c);
}
if (c >= 'A' && c <= 'Z'){
putchar(c);
}
}
return 0;
}
答案 0 :(得分:1)
我想你正在尝试编写一个程序来获得这样的输入:
John David Doe
并将其显示为输出:
John David Doe
删除所有额外的空格。这应该有效:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int c; // getchar value
int blanks = 0; // counting the amount of blanks. If more than one then replace with blanks_2
printf("Enter your name please\n");
while((c = getchar()) != EOF)
{
if(c == ' ')
{
// count blanks
++blanks;
if (blanks==1)
putchar(c); // display only the 1st blank
}
if(isalpha(c))
{
putchar(c);
blanks=0; // reset blanks counter as c is an alpha character
}
}
return 0;
}
答案 1 :(得分:1)
您无需计算空白的确切数量。一旦你找到一个空白&#34;举起一面旗帜&#34;找到空白。当您再次访问非空白字符时,打印一个空白并将标志返回0.此外,插入&#34;继续&#34;代码中的语句,以避免不必要的检查:
int main(void)
{
int c; // getchar value
int blankfound = 0;
printf("Enter your name please\n");
while((c = getchar()) != EOF){
if(c == ' '){
blankfound = 1;
continue;
}
if(c >= 'a' && c <= 'z'){
if (blankfound == 1)
{
putchar(' ');
blankfound = 0;
}
putchar(c);
continue;
}
if (c >= 'A' && c <= 'Z'){
if (blankfound == 1)
{
putchar(' ');
blankfound = 0;
}
putchar(c);
continue;
}
}
return 0;
}
答案 2 :(得分:1)
许多学习者代码分配都基于之前的字符来处理函数的概念。
考虑以下布局
int previous = something();
while ((c = getchar()) != EOF) {
do_stuff(previous, c);
previous = c;
}
对于OP,那将是:如果角色不是空格或前一个角色不是空格,则打印它。
printf("Enter your name please\n");
int previous = 0;
int c;
while((c = getchar()) != EOF) {
if ((c != ' ') || (previous != ' ')) {
putchar(' ');
}
previous = c;
}
简化算法可以帮助人们看到如下所示的缺陷。出现信件时,blanks
不会重置。它会在遇到1个或多个空格时打印。
if(c == ' '){
++blanks;
if (blanks >= 1){
putchar(blankos); }
}
if(c >= 'a' && c <= 'z'){
putchar(c);
}
if (c >= 'A' && c <= 'Z'){
putchar(c);
}
答案 3 :(得分:0)
参考前面的章节(仅在'while'和'if'中使用),我的代码如下所示。
#include <stdio.h>
main()
{
int c;
while ((c = getchar()) != EOF) {
if (c == ' ') {
putchar(c);
while ((c = getchar()) == ' ')
;
}
putchar(c);
}
}