最后一个单词末尾有多余空格

问题描述 投票:0回答:1

这是我的代码。它应该将从一个文件到另一个文件的从 START 到 STOP 的每隔一个单词写下来。该代码工作正常,但最后一个单词的末尾有一个额外的空格。有什么建议么?我尝试了一些东西,但最终只在前面有额外的空间,没有任何空间或多个不需要的空间。

#include <stdio.h>

#define MAX_BUFFER_SIZE 100

typedef struct {
    FILE *inputFile;
    FILE *outputFile;
} FilePair;

void initializeFiles(FilePair *files, char *inputFileName, char *outputFileName);
void closeFiles(FilePair *files);
void processFile(FilePair *files);

int main(int argc, char *argv[]) {
    FilePair files;

    initializeFiles(&files, argv[1], argv[2]);

    if (files.inputFile == NULL || files.outputFile == NULL) {
        return 1;
    }

    processFile(&files);

    closeFiles(&files);

    return 0;
}

void initializeFiles(FilePair *files, char *inputFileName, char *outputFileName) {
    files->inputFile = fopen(inputFileName, "r");
    files->outputFile = fopen(outputFileName, "w");

    if (files->inputFile == NULL || files->outputFile == NULL) {
        char error[] = "Error opening files\n";
        for (int i = 0; error[i] != '\0'; i++) {
            fputc(error[i], files->outputFile);
        }
        fclose(files->outputFile);
        files->outputFile = NULL; 
        fclose(files->inputFile);
        files->inputFile = NULL; 
        return;
    }
}

void closeFiles(FilePair *files) {
    if (files->inputFile != NULL) {
        fclose(files->inputFile);
        files->inputFile = NULL;
    }
    if (files->outputFile != NULL) {
        fclose(files->outputFile);
        files->outputFile = NULL;
    }
}

void processFile(FilePair *files) {
    char startMarker[7] = "START ";
    char stopMarker[5] = "STOP";
    char buffer[MAX_BUFFER_SIZE];
    int startIdx = 0, stopIdx = 0;
    int isStart = 0;
    int spaceCount = 0;

    while (1) {
        int character = fgetc(files->inputFile);
        if (character == EOF) {
            break;
        }

        for (int i = 0; i < MAX_BUFFER_SIZE; i++) {
            buffer[i] = '\0';
        }

        buffer[0] = character;
        for (int i = 1; i < MAX_BUFFER_SIZE - 1; i++) {
            character = fgetc(files->inputFile);
            if (character == EOF || character == '\n') {
                break;
            }
            buffer[i] = character;
        }

        for (int i = 0; buffer[i] != '\0'; i++) {
            char ch = buffer[i];

            if (isStart) {
                if (spaceCount % 2 != 0) {
                    fputc(ch, files->outputFile);
                }
                if (ch == ' ') {
                    spaceCount++;
                }

                if (ch == stopMarker[stopIdx]) {
                    stopIdx++;
                } else {
                    stopIdx = 0;
                }
                if (stopMarker[stopIdx] == '\0') {
                    isStart = 0;
                }
            } else {
                if (ch == startMarker[startIdx]) {
                    startIdx++;
                } else {
                    startIdx = 0;
                }
                if (startMarker[startIdx] == '\0') {
                    isStart = 1;
                }
            }
        }
    }
}

我只是想删除最后一个单词末尾的空格

c stdio
1个回答
0
投票

您可以稍微修改您的逻辑以删除最后一个单词末尾的多余空格。实现此目的的一种方法是维护一个标志来检查当前单词是否是最后一个单词。

这是修改后的代码:

#include <stdio.h>

#define MAX_BUFFER_SIZE 100

typedef struct {
    FILE *inputFile;
    FILE *outputFile;
} FilePair;

void initializeFiles(FilePair *files, char *inputFileName, char *outputFileName);
void closeFiles(FilePair *files);
void processFile(FilePair *files);

int main(int argc, char *argv[]) {
    FilePair files;

    initializeFiles(&files, argv[1], argv[2]);

    if (files.inputFile == NULL || files.outputFile == NULL) {
        return 1;
    }

    processFile(&files);

    closeFiles(&files);

    return 0;
}

void initializeFiles(FilePair *files, char *inputFileName, char *outputFileName) {
    files->inputFile = fopen(inputFileName, "r");
    files->outputFile = fopen(outputFileName, "w");

    if (files->inputFile == NULL || files->outputFile == NULL) {
        char error[] = "Error opening files\n";
        for (int i = 0; error[i] != '\0'; i++) {
            fputc(error[i], files->outputFile);
        }
        fclose(files->outputFile);
        files->outputFile = NULL;
        fclose(files->inputFile);
        files->inputFile = NULL;
        return;
    }
}

void closeFiles(FilePair *files) {
    if (files->inputFile != NULL) {
        fclose(files->inputFile);
        files->inputFile = NULL;
    }
    if (files->outputFile != NULL) {
        fclose(files->outputFile);
        files->outputFile = NULL;
    }
}

void processFile(FilePair *files) {
    char startMarker[7] = "START ";
    char stopMarker[5] = "STOP";
    char buffer[MAX_BUFFER_SIZE];
    int startIdx = 0, stopIdx = 0;
    int isStart = 0;
    int spaceCount = 0;
    int lastWord = 0;

    while (1) {
        int character = fgetc(files->inputFile);
        if (character == EOF) {
            break;
        }

        for (int i = 0; i < MAX_BUFFER_SIZE; i++) {
            buffer[i] = '\0';
        }

        buffer[0] = character;
        for (int i = 1; i < MAX_BUFFER_SIZE - 1; i++) {
            character = fgetc(files->inputFile);
            if (character == EOF || character == '\n') {
                lastWord = 1;  // Mark that this is the last word
                break;
            }
            buffer[i] = character;
        }

        for (int i = 0; buffer[i] != '\0'; i++) {
            char ch = buffer[i];

            if (isStart) {
                if (spaceCount % 2 != 0) {
                    fputc(ch, files->outputFile);
                }
                if (ch == ' ') {
                    spaceCount++;
                }

                if (ch == stopMarker[stopIdx]) {
                    stopIdx++;
                } else {
                    stopIdx = 0;
                }
                if (stopMarker[stopIdx] == '\0') {
                    isStart = 0;
                }
            } else {
                if (ch == startMarker[startIdx]) {
                    startIdx++;
                } else {
                    startIdx = 0;
                }
                if (startMarker[startIdx] == '\0') {
                    isStart = 1;
                }
            }
        }

        if (lastWord) {
            // Check if this is the last word and avoid adding an extra space
            fputc('\n', files->outputFile);
            break;
        }
    }
}

引入

lastWord
变量来跟踪当前单词是否是最后一个单词。如果它是最后一个单词,它会避免在末尾添加额外的空格。此外,它还会向输出文件添加换行符以保持干净的输出。我希望这有助于解决您的错误。如需更多帮助,您可以在下面评论。

© www.soinside.com 2019 - 2024. All rights reserved.