getchar()无法识别输入

时间:2016-03-07 20:05:29

标签: c io console

在下面写了C控制台应用程序以保存输入到字符串。

#include <stdio.h>
#define MAXLINE 200

int main () {
    int c, x;
    char in[MAXLINE];

    for (x = 0;(c = getchar()) != EOF; ++x){
        in[x] = c;
    }
    return = 0;
}

我将操作此字符串并将修改后的版本作为输出打印,但在此之前,我遇到了一个问题 - 每当我使用GDB和监视窗口单步执行代码时,它都会完全忽略水平制表符。我甚至试过写一个解决方法:

#include <stdio.h>
#define MAXLINE 200

int main () {
    int c, x;
    char in[MAXLINE];

    for (x = 0;(c = getchar()) != EOF; ++x){
        if (c == 9)
            in[x] = '\t';
        else
            in[x] = c;
    }
    return = 0;
}

但这与第一个例子完全相同。如何让我的代码识别输入中的选项卡,并将它们保存到数组元素中?

编辑:这是我的实际代码。它在CodeBlocks上编译时没有任何错误,我以前从来没有遇到CodeBlock吞下非打印字符的问题。

#include <stdio.h>
#define MAXLINE 100

int main () {
    int c, q, x, y, z, tabcount;
    char in[MAXLINE];
    char out[MAXLINE];

    for (x = 0;(c = getchar()) != EOF; ++x){
        in[x] = c;
    }

    q = x;
    for (x = y = 0; x <= q; ++x) {
        tabcount = 0;
        if (in[x] == '\t') {
            ++tabcount;
            if (tabcount <= 4) {
                for (z = 0; z <= 4; ++z) {
                    out[y] = ' ';
                    ++y;
                }
            }
            else
                out[y] = '\n';
        }
        else
            out[y] = in[x];
        ++y;
    }
    in[x] = '\0';

    printf ("%s", out);

    return 0;
}

2 个答案:

答案 0 :(得分:0)

修改后确保y每个输出字符只增加一次,这样就可以了 - 只要你没有溢出输入或输出缓冲区。添加注释以显示您可能会超出缓冲区的位置。

#include <stdio.h>
#define MAXLINE 100

int main () {
    int c, q, x, y, z, tabcount;
    char in[MAXLINE];
    char out[MAXLINE];

    for (x = 0;(c = getchar()) != EOF; ++x){ 
        in[x] = c; // <--- OVERFLOW CAN HAPPEN IF INPUT > 100 chars
    }

    q = x;
    for (x = y = 0; x <= q; ++x) {
        tabcount = 0;
        if (in[x] == '\t') {
            ++tabcount;
            if (tabcount <= 4) {
                for (z = 0; z <= 4; ++z) {
                    out[y] = ' '; // <-- Can overflow here too
                    ++y;
                }
            }
            else
            {
                out[y] = '\n';   // <-- And here
                ++y;
            }
        }
        else
        {
            out[y] = in[x];  // <-- and here
            ++y;
            /* I'm guessing you probably want to do tabcount=0 here 
             * if the goal is 5x tab-separated fields per line. */
        }
    }
    in[x] = '\0'; // <-- AND HERE!

    printf ("%s", out);

    return 0;

}

答案 1 :(得分:0)

原来GDB和/或CodeBlocks正在窃取我的标签。如果我编译/构建/运行save-input-to-string应用程序,它会很好地打印制表符。显然我只是无法调试较大的程序或任何需要识别标签作为输入的程序,这很奇怪而且很烦人。