gpt4 book ai didi

c - strcmp() 和文本文件中的换行符

转载 作者:太空宇宙 更新时间:2023-11-03 23:32:06 25 4
gpt4 key购买 nike

我正在尝试使用 strcmp() 来测试文本文件中的特定行是否等于换行符 (\n)。我正在从一个文本文件中收集每一行,并将它们写入另一个文本文件。如果源文件中的整行只是一个换行符,我不想在目标文件中写入该行。

我认为下面的代码可以用于此目的,但事实并非如此。但是,如果我将条件中的数值从 0 更改为 3,它就会像我希望的那样工作。知道为什么吗?

我的目标是更改我的条件,使其使用数值 0,这意味着 strcmp() 找到完全匹配,但我不知道如何更改条件的其他部分这样做。

#include <stdio.h>

void process_file(const char *inp_file, FILE *otp_fp) {

char line[256];
FILE *inp_fp = fopen(inp_file, "r");

if (inp_fp != NULL) {
while(fgets(line, 256, inp_fp) != NULL) {

if (strcmp (line, "\n") != 0) { //changing to 3 gets desired result
fprintf(otp_fp, line);
}

}
}

fclose(inp_fp);

}

最佳答案

对您描述的行为的唯一解释是这些行并不是真正的空行。它们中必须有一些空格(如空格或制表符)。如果你想省略这些行,那么你必须检查它们是否真的只包含空格。

(我还修复了您的代码中的一个问题,如果 fclose() 失败,您将尝试 fopen() 一个 NULL 指针。这也演示了如何通过仅在出错后运行代码来降低函数的缩进级别条件已经处理。)

int str_is_whitespace(const char* line) {
int onlyws = 1;
int i = 0;
while (onlyws && line[i] != '\0') {
if (!isspace(line[i])) {
onlyws = 0;
}
++i;
}
return onlyws;
}

void process_file(const char *inp_file, FILE *otp_fp) {
char line[256];
FILE *inp_fp = fopen(inp_file, "r");
if (inp_fp == NULL) {
return;
}
while(fgets(line, 256, inp_fp) != NULL) {
// Only output the text if it doesn't consist only of whitespace.
if (!str_is_whitespace(line)) {
fprintf(otp_fp, "%s", line);
}
}
fclose(inp_fp);
}

您需要包括 <ctype.h>对于 isspace() .

请注意,您会遇到长度超过 255 个字符的行和 fgets() 的问题。碰巧读取了一行中只有空格的剩余部分。如果要处理它,则需要额外的逻辑来确定当前文本是否实际上是较大行的一部分。

关于c - strcmp() 和文本文件中的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13106108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com