C修剪程序不起作用

时间:2012-10-28 02:10:06

标签: c trim

我是新程序员。 你能帮我解释为什么这个C测试程序不能正常工作吗? 它应该是一个修剪函数:

#include <stdio.h>

#define MAX 1000

void main(){
    char line[MAX];
    int lgh;
    line[0] = '\0';
    while ((lgh = getLine(line, MAX)) != 0){
        printf("%s", line);
        line[0] = '\0';
    }
}

int getLine(char s[], int length){
    char s2[length];
    int i, ii, qttWord = 0, qttWord2 = 0;
    int c; // c = getchir() d = EOF
    int flag = 2;

    s2[0] = '\0';
    /*Reads the input and puts it into s[], then, verifies if the input is just \n,
    * if so, returns 0(i), if not, puts '\n' at the end of the string ind '\0' to close
    */
    for (i = 0; i < length-1 && (c = getchar()) != EOF && c != '\n'; ++i){
         s[i] = c;
         ++qttWord;
    }
    if (i == 0){
        if (c == '\n')
            return 0;
    } else if (c == '\n'){
        s[i] = c;
        ++qttWord;
        ++i;
        s[i] = '\0';
    }
    fflush(stdin);
    /*Verifies if the string is just ' ' or '\t'
    * if so, returns 0
    */
    for (i = 0; i <= qttWord && flag != 1; ++i){
        if (s[i] == ' ' || s[i] == '\t'){
            flag = 0;
        } else{
            flag = 1;
        }
    }
    if (flag == 0)
        return 0;
    /*
    *The trim function
    */
    for (i = 0; i < qttWord; ++i){
        if (i < qttWord-1){
            if (s[i] == ' ' && s[i+1] != ' '){
                s2[i] = s[i];
                ++qttWord2;
                printf("1%d\n", s2[i]);//test thing
            }
        }
        if (s[i] != ' '){
            s2[i] = s[i];
            ++qttWord2;
            printf("0%d\n", s2[i]);//test thing
        }
    }
    s[0] = '\0';
    s2[qttWord2+1] = '\0';
    printf("Q:%d\n", qttWord2);//test thing
    printf("A:%s\n", s2);//test thing
    for (i = 0; i < qttWord2+1; ++i){
        s[i] = s2[i];
    }
    return 1;
}

正如您所看到的,我创建了一系列printf测试,以了解它为什么不起作用,但它没有帮助。 我不明白为什么它不起作用。

1 个答案:

答案 0 :(得分:1)

使用更多标准库函数,特别是fgets()来读取行,isspace()来标识空格字符,memmove()来复制数据,产生以下代码:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define MAX 1000

static int getLine(char s[], int length);

int main(void)
{
    char line[MAX];
    int lgh;
    /* Stop on EOF or a blank line */
    while ((lgh = getLine(line, MAX)) > 0)
        printf("%d <<%s>>\n", lgh, line);
    return(0);
}

/*
** Get a line of input with leading and trailing white space
** stripped off.  The newline is not included.  If there is no
** newline in the space available, the length 0 is returned.
** If EOF is encountered, EOF is returned.
*/
static int getLine(char s[], int length)
{
    char s2[length];

    s[0] = '\0';
    if (fgets(s2, sizeof(s2), stdin) == 0)
        return EOF;

    size_t len = strlen(s2);
    if (s2[len-1] != '\n')
        return 0;   /* No newline - line too long */

    /* Find first non-white space */
    size_t off = 0;
    while (isspace(s2[off]))
        off++;
    if (off > len)
        return 0;

    /* Chop trailing space */
    while (len-- > 0 && isspace(s2[len]))
        s2[len] = '\0';

    /* Non-blank string is in s2[off]..s2[len], plus trailing '\0' */
    memmove(s, &s2[off], len-off+2);
    return(len - off + 1);  /* Length excluding trailing null */
}

请注意main()中的诊断输出包括报告的长度以及精心分隔的输出字符串,后跟换行符。显然,如果您愿意,可以使用严格检查空白和制表符的代码替换isspace()。您可以编写自己的fgets()类似物。

你的原始代码在第一行输入后得到EOF时不喜欢它(我不认为我在空输入上尝试了它)。务必确保妥善处理堕落的案件。