从char *结束剥离新行字符

时间:2016-08-17 13:43:38

标签: c

我使用了char* line while (fgets(line, line_size, fNames) != NULL)。现在的问题是我还得到了一个新的行字符,我想剥离它。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int i;
    char fileName[30];
    FILE *fNames, *fCurrent;
    char *line = NULL, command[100];
    char letters3[3];
    size_t len = 0;
    //size_t read;
    const size_t line_size = 300;
    line = malloc(line_size);
    if (access("fileNames.lst", F_OK) == -1)
        system("crunch 3 3 abcd -o fileNames.lst");
    else
        printf("fileNames.lst already exists.\n");
    fNames = fopen("./fileNames.lst","r");

    while (fgets(line, line_size, fNames) != NULL) {
        printf("Making File: %s.lst\n", line);
        strcpy(command, "crunch 8 8 -t ");
        strcpy(command, line);
        strcpy(command, strcat(command," -o"));
        puts(command);
        strcpy(line, strcat(line, ".lst"));
        fCurrent = fopen(line, "w");
        //system(command);
        fclose(fCurrent);
        //system("read -r -p \"Press space to continue...\" key");
    }
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您的代码存在问题:

  • 您不会检查fopen()的返回值,也不会检查malloc()的返回值。

  • strcpy(command, strcat(command," -o"));strcpy(line, strcat(line, ".lst"));在重叠字符串上调用strcpy时会调用未定义的行为。

  • strcpy(command, line);使用command覆盖您刚刚复制到strcpy(command, "crunch 8 8 -t ");的字符串。

  • 在复制或将字符串连接到linecommand之前,您不会检查长度。您应该使用snprintf()来获得更安全,更简单的方法。

要删除line留下的fgets()中的尾随换行符,您可以写:

line[strcspn(line, "\n")] = '\0';

或者你可以这样写:

char *p = strchr(line, '\n');
if (p != NULL)
    *p = '\0';

甚至是删除字符串末尾的换行符的那个:

size_t len = strlen(line);
if (len > 0 && line[len - 1] == '\n')
    line[--len] = '\0';

使用后两种方法,您可以跟踪是否确实存在换行。在行尾没有换行可能意味着以下几种可能性之一:

  • 该行被截断,因为它不适合所提供的缓冲区。您应该小心处理此情况,因为读取的字符串与实际文件内容不对应。如果文件名长度超过298字节,则可能发生这种情况,这在许多现代文件系统中都是可能的。

  • 已到达文件末尾,但最后一行末尾的文件中没有换行符。这可能不是错误,但可能表示输入文件以某种方式被截断。

  • 输入文件包含'\0'字节,这会导致fgets()读取的行提前终止。这不会被允许作为文件名的一部分,并且不太可能出现在文本文件中,除非文件被编码为ucs2或UTF-16。

答案 1 :(得分:1)

我想你正在寻找这个。它非常易于使用,并且可以完成这项工作。

line[strcspn(line, "\n")] = '\0';