检查C中的空白程序无法正常工作

时间:2015-05-04 16:03:06

标签: c whitespace removing-whitespace

我正在尝试在一个充满字符的文件中检查顺序空格。我希望我的程序在一系列字符后忽略超过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个空格

你知道为什么会这样吗?我的代码有哪些缺陷?

谢谢!

2 个答案:

答案 0 :(得分:2)

每次获得新角色时,您都会递增charCount。在输出中添加新字符时,您应该只更新charCount

否则,在遇到第二个空格后,您将要比较未知(或任何sentenceArray初始化为)值,这将导致检查if(sentenceArray[charCount-1] != ' ')结果为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()

答案 1 :(得分:0)

代码需要跟踪前一个char是否为空格。

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

while ((ch = getc(file)) != EOF && charCount < 1000) {

    if (isspace(ch)) {
      if (!previous_space) {
        sentenceArray[charCount++] = ' ';
        previous_space = 1;
        }
      }
    else {
      sentenceArray[charCount++] = ch;
      previous_space = 0;
    }
}