Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C语言中的getchar()函数_C++_C_String_Input_Getchar - Fatal编程技术网

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()
的结果也是错误的。@JamesKanze
char
getchar()
的主要问题不是
getchar()
的可能返回值的数量,而是
char
的签名性。因为标准并没有指定字符是有符号的还是无符号的,
EOF
等于
-1
,所以它将无符号的
255
存储在字符中。然后将char与EOF进行比较就是将
无符号char
与负常量进行比较,这完全是错误的。@JamesKanze如果问题只是分配给char的
getchar
结果,那么为什么该代码仍然不起作用?是的,我记不起
EOF
是-1,我使用的是字符。@decas
EOF
通常是-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;
}