我使用了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;
}
答案 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 ");
的字符串。
在复制或将字符串连接到line
和command
之前,您不会检查长度。您应该使用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';