我正在尝试用一个空格替换多个空格。
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 500
main() {
char text[MAXLINE];
int i;
for(i = 0; (text[i] = getchar()) != EOF && text[i] != 'x'; i++) {
if(text[i] == ' ')
i++;
while((text[i] = getchar()) != EOF && text[i] != 'x' && text[i] == ' ');
if(text[i] == EOF || text[i] == 'x')
break;
}
text[i] = '\0';
printf("\n\n-- Result --\n%s", text);
}
我知道getchar()
期待按下enter
之后的字符,但我已经多次看到,人们如何使用它来获取整个字符串直到找到EOF
。即使在这个例子中,如果我注释掉while
循环也是可行的(如果我写一个没有空格的单词,我会得到一个正确的字符串)。我想要的是把一个人写的每个字符串放在一个数组中。 getchar()
函数在这种情况下可以正常使用吗?如果是,我需要在此代码中更改哪些内容才能使其正常工作,因为现在它只打印一些字符(如果while
循环未被注释掉)?正如我所说,如果我在没有空格且没有apple
循环的情况下写一个单词while
或类似单词,它就有效。
答案 0 :(得分:0)
要读取用户的所有输入直到输入结束,跳过多次出现的空格,请使用类似的内容。
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 500
int main() {
char text[MAXLINE];
int i;
int c;
c = getchar();
for (i = 0; c != EOF && i < MAXLINE-1; ++i) {
text[i] = c;
if ( c != ' ' ) {
c = getchar();
} else {
while ( c == ' ' )
c = getchar();
}
}
text[i] = '\0';
printf("\n\n-- Result --\n%s", text);
}
答案 1 :(得分:0)
getchar
会返回int
,而不是char
,因为它必须能够
返回一个超出char
的值。它是
将结果分配给char
的编程错误,因为您
松散的关键信息。取决于是否char
已签名或未签名,在分配后检查EOF
它对char来说意味着你永远找不到EOF
(平原
char
无符号),或输入中的某个字符(ÿ
in
拉丁语1(通常)将被视为EOF
。
在C ++中,等价物是std::cin.get()
,但我们会更多
通常写一些类似的东西:
for ( int i = 0;
i < sizeof( text ) && std::cin.get( text[i]) && text[i] != 'x';
++ i ) {
// ...
}
(当然,在C ++中,我们很可能使用std :: string,而不是
只需输入一个char
或int
。)
在C中(因为它看起来就像你实际使用的那样), 你需要一个额外的中间变量:
int ch;
for ( int i = 0;
i < sizeof(text) && (ch = getchar()) != EOF && ch != 'x';
++ i ) {
text[i] = ch;
// ...
}
另请注意,在两种语言中,您都需要将边界检查为
第一个条件。 (在C ++中,如果您正在使用它,则不需要它
std::string
。)
答案 2 :(得分:0)
你的while循环读取时没有递增i
。因此,读取的所有字符实际上都被丢弃了,因为它们被下一个循环覆盖。如果仅用一个空白替换多个空白,你可以做类似的事情
char text[1024];
int i;
int c;
for(i = 0; i < sizeof(text)-1 && (c = getchar()) != EOF && c != 'x'; ) {
if( c != ' ' || i == 0 || text[i-1] != ' ' )
text[i++] = c;
}
作为注释中的statetd:不要直接将getchar()
的结果直接分配给char,否则将字节读取与EOF进行比较可能会导致为true,尽管您尚未到达文件末尾然而。