c - 当我打印缓冲区中的内容时,我的代码打印垃圾值

标签 c

这是一个接受 std 输入并显示以换行符结尾的 72 个字符的程序 如果输入的数量小于 72,则必须附加终止空字符,如果我打印缓冲区,我会得到垃圾值。这里出了什么问题

int main()  {
int buffer[ MAX_CHAR ];
int count = 0, ch = 0, i = 0;

while( (ch = getchar() != '@') ) {
    // Buffer used to collect the i/p characters from the std i/p
    buffer[count++] = ch;
    if( MAX_CHAR - 1 == count ) {

        buffer[ MAX_CHAR + 1 ] = '\n';
        for(i = 0; i < MAX_CHAR; i++)
            printf("%c", buffer[i]);
        count  = 0;
        buffer[ MAX_CHAR ] = 0;
        }
    }
    //If the input character is less than 72, then append the rest with spaces
    if( count != MAX_CHAR - 1)  {

        for(i = count; i < MAX_CHAR - 1; i++)
            buffer[ count ] = ' ';
        buffer[ MAX_CHAR ] = '\n';
        for(i = 0; i < MAX_CHAR; i++)
            printf("%c", buffer[i]);
        }
   }

最佳答案

你有:

while( (ch = getchar() != '@') ) {

这将被解析为:

while( (ch = (getchar() != '@')) ) {

因此 ch 的值为 0 或 1。您想要的是:

while( ((ch = getchar()) != '@') ) {

此外,通过在缓冲区末尾写入内容,您在某些地方会出现未定义的行为:

int buffer[ MAX_CHAR ];
...
buffer[ MAX_CHAR + 1 ] = '\n';
...
buffer[ MAX_CHAR ] = 0;

关于c - 当我打印缓冲区中的内容时,我的代码打印垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17660026/

相关文章:

c - I2C 符号链接(symbolic link)

c - multiset 和 set 混合的可能的字符串排列

c - 初始化指向 char 的指针数组

c++ - 要在 scanf() 的扫描集中包含一个连字符作为元素,它应该是列表中的第一个字符还是最后一个字符?

c++ - 捕获 libc 错误消息,从/dev/tty 重定向

c - 如何在 C 中使用带有用户输入的循环函数?

c - 程序不会将字符存储在c中的二维数组中

c - 为什么 POSIX 与 ISO C 标准相矛盾

c - %*s 格式说明符 C

c - 发送邻居请求而不是 ICMPV6 回显请求