提问人:phos 提问时间:11/17/2020 最后编辑:phos 更新时间:11/17/2020 访问量:281
putchar() 输出是一个问号,而不是输入的输入流
putchar() output is a question mark instead entered input stream
问:
我正在尝试在 do-while 循环中输出带有字母字符的输入流,并且何时 用户执行 EOF(+) 循环停止,输出应该是输入流,但输出只是一个盒子里的问号......这里出了什么问题?ctrld
#include <stdio.h>
int main(){
char c;
do{
c = getchar();
} while (c != EOF);
printf("Output:\n");
putchar(c);
return 0;
}
答:
1赞
Aplet123
11/17/2020
#1
getchar
返回 an ,所以你应该把你的字符设为 int。此外,如果你得到一个 and you overwrite ,那么你将在循环之后调用,这不是一个可打印的字符。(EOF 是哪个被强制转换为哪个成为 )。如果需要输入流,则必须存储输入流:int
EOF
c
putchar(EOF)
-1
char
\xff
#include <stdio.h>
#define INPSIZE 2000
int main() {
char inp[INPSIZE + 1];
int i = 0;
while (1) {
int c = getchar();
if (c == EOF) {
break;
}
inp[i++] = c;
// don't overflow
if (i >= INPSIZE) {
break;
}
}
// we need terminating nullbyte
inp[i] = '\x00';
puts("Output:");
puts(inp);
}
0赞
alex01011
11/17/2020
#2
退出循环时,变量 c 始终保持 EOF 状态值。您可以尝试将输入保存在数组中,或者更简单的方法,您可以在循环中显示每个字符。
存储在阵列中:
#include <stdio.h>
#define SIZE 500
int main (void)
{
char c;
char arr[SIZE];
size_t i = 0U;
while ((c=getchar())!=EOF)
{
if (i<SIZE-1) /* Consider you want your output as a string,save space for NULL */
{
arr[i++]=c;
}
else
{
puts("buffer full");
break;
}
}
arr[i]='\0';
printf ("Output: %s\n",arr);
return 0;
}
显示每个字符:
#include <stdio.h>
int main (void)
{
char c;
while ((c=getchar())!=EOF)
{
putchar(c);
}
return 0;
}
0赞
phos
11/17/2020
#3
我设法完成了我想要编写代码的方式:
#include <stdio.h>
int main (void){
int c;
char c_arr[500];
size_t i = 0U;
do{
c_arr[i++] = c = getchar();
}while(c!= EOF);
c_arr[i] = '\0';
i-=1;
printf("Output:\n");
for(size_t a = 0U ; a < i; a++){
putchar(c_arr[a]);
}
return 0;
}
该代码可以吗,或者是否有任何可能的优化?
另一个问题是关于size_t的,它是否比普通的 int 更好地用于数组或 for 循环,就像我在 for 循环中所做的那样,还是无关紧要?
感谢所有试图提供帮助的人。
评论
0赞
pmg
11/17/2020
a) 不是真正的优化......但是你可以提高缩进的一致性和空格的使用,检查你是否没有在数组中写入超过 500 个字符;b) vs 对于您的示例来说应该无关紧要,尽管(或)更自然,因为您永远不会有负索引。int
size_t
size_t
unsigned
0赞
phos
11/17/2020
我真的不明白你在答案 A 中的意思)
评论
char c
只为一个字符提供存储。它不会连接循环中返回的所有字符。循环后,它具有返回的最后一个字符,即 EOF。getchar()
getchar()
putchar(c)
int c;