程序不会退出EOF并且如果最后一个字符是'[space]'则不会打印

时间:2016-05-11 01:57:39

标签: c arrays char

我是C的新手所以请原谅我的误会。我正在尝试编写一个简单的程序,它接受用户字符输入,改变它,然后在“piglatin”中打印出来......其中一个单词的第一个字母移到单词的末尾,然后是“ay”被附加在单词的末尾。例 - > “喜欢”这个词变成了......“ikelay”。这是我的计划......

//pig latin

#include <stdio.h>
#define MAX 1000

void pigify(char chars[], int cnt);
void sortWords(char stream[], int total);
void clearWord(char word[], int j);

int main(){

    int c, i;
    char allChars[MAX];


    i = 0;

    while((c = getchar()) != EOF){
        allChars[i] = c;
        ++i;
    } 

    allChars[i] = '\0';

    sortWords(allChars, i);

    return 0;

}



/////////////////
/////////////////
void sortWords(char stream[], int total){

    int i, j, start, end, m;
    char words[total];

    clearWord(words, total);

    i = j = end = m = 0;

    while(stream[i] != '\0'){
        if(stream[i] != '\n' && stream[i] != '\t' && stream[i] != ' '){
            ++i;
            ++j;
        } else if (j > 2){
            end = i;
            for(start = i-j; start <= end; ++start){
                words[m] = stream[start];
                ++m;
            }

            pigify(words, m);
            clearWord(words, m);
            j = m = 0;
        }

    }   

}

/////////////////
/////////////////
void clearWord(char word[], int i){
    int j;

    for (j = 0; j <= i; ++j){
        word[j] = '\0'; 
    }

}



/////////////////
/////////////////
void pigify(char alls[], int cnt){

    int j;
    char pchars[cnt+3];

    j = 0;

    while(alls[j] != '\0'){
        pchars[j] = alls[j];
        ++j;
    }


    if(alls[0] != 'a' && alls[0] != 'e' && alls[0] != 'i' && alls[0] != 'o' &&     alls[0] != 'u'){
        pchars[cnt] = alls[0];
        pchars[cnt+1] = 'a';
        pchars[cnt+2] = 'y';
        pchars[cnt+3] = '\0';
        pchars[0] = ' ';
    }


    printf("\npost pigification --> %s\n", pchars);

}

我已经待了很长时间了,我无法找到我犯了错误的地方。我不太关心这个程序,我不需要将输入转换为“piglatin”,但我真的很想知道我做错了什么!帮助,建议和/或指针会很棒!谢谢

3 个答案:

答案 0 :(得分:1)

编写外部数组边界。使用<

char words[total];
clearWord(words, total);

void clearWord(char word[], int i){
    int j;
    // for (j = 0; j <= i; ++j){
    for (j = 0; j < i; ++j){
        word[j] = '\0'; 
    }
}

也可能有其他问题

答案 1 :(得分:0)

替换此行:

while((c = getchar()) != EOF){
    allChars[i] = c;
    ++i;
} 

有了这个:

while ((allChars[i] = getchar()) != '\n')
    i++;

否则,每次按Enter键,循环都会重新开始。也许其他人可以解释一下,但上面的代码会让你的代码做你想要的。

将来,fgets()这样的功能可能更适合您的需求,因为您不必担心检查EOF等等 - 您只需要在最后删除换行符那种情况。

答案 2 :(得分:0)

使用帮助形式@chux并在使用一些更多的print语句来查明发生了什么之后,我意识到在函数sortWords中,变量i没有针对其中的情况递增void sortWords(char stream[], int total){ int i, j, start, end, m; char words[total]; clearWord(words, total); i = j = end = m = 0; while(stream[i] != '\0'){ if(stream[i] != '\n' && stream[i] != '\t' && stream[i] != ' '){ ++i; ++j; } else if (j > 2){ end = i; for(start = i-j; start <= end; ++start){ words[m] = stream[start]; ++m; } pigify(words, m); clearWord(words, m); j = m = 0; ++i; } } } 一个空间&#39;&#39; &#39;&#39;字符或新的行或标签字符&#39; \ n&#39;&#39;和&#39; \ t&#39;&#39;达成了。将功能更改为此后...

Q_DECLARE_OPERATORS_FOR_FLAGS

该计划至少可以按预期运作。我打算用这个问题解决的错误至少是固定的。仍然不完美,但我认为这对我来说是个问题很少,应该结束