Я сделал свою первую программу на Си.Он удаляет комментарии C ('//').Я передаю строку в функцию strip_comments, создаю новую строку с тем же размером, что и строка аргумента, а затем копирую, char by char, игнорируя комментарии.
Это код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define IN 1
#define OUT 0
int file_size(FILE *file);
char * strip_comments(char *content);
int main(int argc, char *argv[])
{
FILE *file;
char *buffer, *content;
int size;
if (argc == 1)
{
printf("USAGE: stripccomments filename\n");
return 1;
}
if ((file = fopen(argv[1], "rw")) == NULL)
{
printf("Could not open file '%s'.\n", argv[1]);
return 1;
}
size = file_size(file);
buffer = malloc(sizeof(char) * size);
if (buffer == NULL)
{
printf("Could not allocate memory\n");
return 1;
}
fread(buffer, sizeof(char), size, file);
content = strip_comments(buffer);
printf("%s", content);
free(buffer);
fclose(file);
return 0;
}
int file_size(FILE *file)
{
int size;
fseek(file, 0, SEEK_END);
size = ftell(file);
rewind(file);
return size;
}
char * strip_comments(char *content)
{
int state, length, i, j;
char *new_content;
state = OUT;
length = strlen(content);
new_content = malloc(sizeof(char) * length);
j = 0;
for (i = 0; i < length; i++)
{
if (content[i] == '/' && content[i + 1] == '/')
{
state = IN;
i++;
continue;
}
if (state && content[i] == '\n')
{
state = OUT;
}
if (!state)
{
new_content[j] = content[i];
j++;
}
}
new_content[j + 1] = '\0';
return new_content;
}
Если есть какие-то комментарии, я просто буду использовать несколько байтов выделенной строки.Я не хочу выделять больше, чем буду использовать.Какой лучший способ сделать это и вернуть новую строку?Или я должен изменить строку, переданную в качестве параметра?
ОБНОВЛЕНИЕ: Что происходит с этим неиспользуемым пространством?Остается ли он в «подвешенном состоянии»?И что происходит с этим пробелом, когда выполнение заканчивается?
Спасибо.