我正试图检查一个充满字符的文件中是否有连续的空白。我希望我的程序忽略字符序列后超过1个空格。此外,制表符将替换为空白。我正在打开一个文件并阅读它,所以不要担心代码的那一部分,因为它可以工作。我的代码:

char ch;
char sentenceArray[1000];
int charCount = 0;

    while (1) {
        ch = getc(file);

        //If is some sort of space, check it
        if(ch == ' '){
            if(sentenceArray[charCount-1] != ' '){
                sentenceArray[charCount] = ' ';
            }
        }else if(ch == '\t'){
            if(sentenceArray[charCount-1] != ' '){
                sentenceArray[charCount] = ' ';
            }
        }else{
            printf("Not space");
            sentenceArray[charCount] = ch;
        }
        charCount++;
    }

void print()
{
    int i;
    for(i = 0; i<= charCount; i++){
        printf("%c", sentenceArray[i]);
    }
}

唯一相关的主线是:
print();
如果我给它一个文件:
myprog < file1
我的文件内容如下:
Uno Dos Tres Cuatro a
其中,在Uno和Dos之间有1个空格,在Dos和Tres之间有2个空格,在Tres和Cuatro之间有3个空格,在Cuatro和a之间有一个制表符。
这是输出(我打印数组):
Uno Dos Tres Cuatro a
如你所见,我的程序成功地消除了2个连续空间。。。如果它们更多,它会继续删除两个,但是如果它们更多,比如说10个,它只会取出2个,然后打印8个空格。
你知道为什么会这样吗?我的代码有什么缺陷?
谢谢!

最佳答案

每次你得到一个新角色时,你都在递增。只有在向输出中添加新字符时,才应该更新charCount
否则,您将在遇到第二个空格后与未知值(或任何初始化为的值)进行比较,这将导致检查结果为true并添加另一个空格。

  //If is some sort of space, check it
    if ((ch == ' ') || (ch == '\t')){
        if((charCount == 0) || (sentenceArray[charCount-1] != ' '))
        {
            sentenceArray[charCount] = ' ';
            charCount++; // <-- added this here
        }
    }else{
        printf("Not space");
        sentenceArray[charCount] = ch;
        charCount++; // <-- added this here
    }
    // charCount++; <-- remove this

另一方面,您可能希望使用isspace()

09-28 04:29