putchar() 输出是一个问号,而不是输入的输入流

putchar() output is a question mark instead entered input stream

提问人:phos 提问时间:11/17/2020 最后编辑:phos 更新时间:11/17/2020 访问量:281

问:

我正在尝试在 do-while 循环中输出带有字母字符的输入流,并且何时 用户执行 EOF(+) 循环停止,输出应该是输入流,但输出只是一个盒子里的问号......这里出了什么问题?ctrld

#include <stdio.h>

int main(){
    char c;

    do{
        c = getchar();
    } while (c != EOF);

    printf("Output:\n");
    putchar(c);

    return 0;
}
c do-while eof getchar putchar

评论

0赞 user3386109 11/17/2020
char c只为一个字符提供存储。它不会连接循环中返回的所有字符。循环后,它具有返回的最后一个字符,即 EOF。getchar()getchar()
1赞 alex01011 11/17/2020
c 值等于 EOF 状态。所以你基本上是在“尝试显示EOF”。
1赞 Barmar 11/17/2020
放入循环内。putchar(c)
0赞 Barmar 11/17/2020
另外,您需要声明int c;

答:

1赞 Aplet123 11/17/2020 #1

getchar返回 an ,所以你应该把你的字符设为 int。此外,如果你得到一个 and you overwrite ,那么你将在循环之后调用,这不是一个可打印的字符。(EOF 是哪个被强制转换为哪个成为 )。如果需要输入流,则必须存储输入流:intEOFcputchar(EOF)-1char\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 对于您的示例来说应该无关紧要,尽管(或)更自然,因为您永远不会有负索引。intsize_tsize_tunsigned
0赞 phos 11/17/2020
我真的不明白你在答案 A 中的意思)