C++ C语言中的getchar()函数
我试图用一个空格替换多个空格C++ C语言中的getchar()函数,c++,c,string,input,getchar,C++,C,String,Input,Getchar,我试图用一个空格替换多个空格 #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
#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);
}
#包括
#包括
#定义MAXLINE 500
main(){
字符文本[MAXLINE];
int i;
for(i=0;(text[i]=getchar())!=EOF&&text[i]!='x';i++){
如果(文本[i]='')
i++;
while((text[i]=getchar())!=EOF&&text[i]!='x'&&text[i]='';
if(text[i]==EOF | | text[i]=='x')
打破
}
文本[i]='\0';
printf(“\n\n——结果--\n%s”,文本);
}
我知道
getchar()
在按下enter
后需要一个字符,但我已经见过很多次,人们如何使用它来获取整个字符串,直到找到EOF
。即使在本例中,如果我注释掉while
循环(如果我写一个没有空格的单词,我会得到一个正确的字符串),它也会起作用。我想要的是把一个人写的每个字符放到一个数组中。在这种情况下可以使用getchar()
函数吗?如果是,我需要对此代码进行哪些更改才能使其正常工作,因为现在它只打印一些字符(如果而循环未被注释掉)?正如我所说,如果我写一个单词apple
或类似的单词,没有空格,也没有while
循环,它就会起作用。要读取用户的所有输入,直到输入结束,跳过行中多次出现的空格,请使用类似的方法
#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);
}
#包括
#包括
#定义MAXLINE 500
int main(){
字符文本[MAXLINE];
int i;
INTC;
c=getchar();
对于(i=0;c!=EOF&&i
getchar
返回一个int
,而不是char
,因为它必须能够
返回一个超出char
的值。它是
将结果分配给字符的编程错误,因为
松散的关键信息。取决于纯char
已签名或未签名,在分配后检查EOF
将其转换为字符意味着您永远无法找到EOF
(普通
char
unsigned),或输入中的某个字符(ÿ
in
拉丁语1(通常)将被视为EOF
<>在C++中,等价的是代码> STD::CIN。
通常写下如下内容:
for ( int i = 0;
i < sizeof( text ) && std::cin.get( text[i]) && text[i] != 'x';
++ i ) {
// ...
}
还要注意的是,在这两种语言中,都需要边界检查
第一个条件。(C++中,如果你使用的话,你不需要它。
std::string
)您的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;
}
char文本[1024];
int i;
INTC;
对于(i=0;i
如注释中所述:不要直接将getchar()
的结果分配给char,否则将读取的字节与EOF进行比较可能会导致为true,尽管您尚未到达文件末尾 注意main()
应该(必须)返回int
。您应该测试溢出(i
)。谢谢。一旦我解决了当前的问题,我将解决这些问题。还要注意,getchar()
,尽管它是一个非常容易交流的名称,(因为EOF
不适合字符)。是的,但我使用的是字符数组,它将getchar
返回的整数转换为ASCII字符。谢谢。我的getchar
实现出了什么问题?@decas您将结果分配给了char
。在一个具有8位字节的典型实现中,getchar
有257个不同的可能返回值,因此结果不能毫无损失地放入char
中。在您的代码中,只有在出现空格时才递增i
,所以我敢打赌,您会得到每个单词的第一个字符数组。在char
中存储getchar()
的结果也是错误的。@JamesKanzechar
和getchar()
的主要问题不是getchar()
的可能返回值的数量,而是char
的签名性。因为标准并没有指定字符是有符号的还是无符号的,EOF
等于-1
,所以它将无符号的255
存储在字符中。然后将char与EOF进行比较就是将无符号char
与负常量进行比较,这完全是错误的。@JamesKanze如果问题只是分配给char的getchar
结果,那么为什么该代码仍然不起作用?是的,我记不起EOF
是-1,我使用的是字符。@decasEOF
通常是-1。所需的只是它是负数(并且getchar
返回EOF
或范围[0…UCHAR\u MAX]
中的值)。是的,我正在丢弃空格,因为我只需要一个。
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;
}