Я просматриваю K & R упражнений с самого начала, и я расширяю все, что предназначено для stdin в качестве файла, который должен быть передан как argv. Дело в том, что в этом упражнении функция работает неправильно, я думаю, что это проблема с strlen, но я просто не могу понять, что это на самом деле. Функция правильно меняет строки файла (по-видимому), но я всегда получаю первые два символа первой строки в каждой инвертированной строке. «Напишите функцию reverse, которая меняет символ string s. Используйте его для записи программы, которая меняет направление ввода строки за раз».Упражнения K & R 1-19 переделать для файла, который будет считаться аргументом
#include <stdio.h>
#include <string.h>
const unsigned MAXLINE = 10000;
char* reverse(char string[])
{
char rev[MAXLINE];
int i, j;
for (i = strlen(string)-1, j = 0; i >= 0, j < strlen(string); --i, ++j)
rev[j] = string[i];
return rev;
}
unsigned fgetline(char s[], unsigned lim, FILE *file)
{
unsigned i;
char c;
for (i = 0; (c = fgetc(file)) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n')
{
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
int main(int argc, char *argv[])
{
FILE *input = fopen(argv[1], "r");
char line[MAXLINE];
unsigned len = 0;
if (argc != 2 || !input)
puts("INSERT VALID INPUT FILE");
else
{
while ((len = fgetline(line, MAXLINE, input)) > 0)
{
printf("%s\n", reverse(line));
putchar('\n');
}
fclose(input);
}
return 0;
}
Вы возвращаете указатель на локальный буфер в 'реверс()', так что я на самом деле удивлен, это работает на всех. Кроме того, вы забыли обнулить конец «rev» перед возвратом. –
При компиляции всегда включайте все предупреждения. (для gcc, при минимальном использовании: '-Wall -Wextra -pedantic') Затем компилятор расскажет вам о многочисленных проблемах с синтаксисом с опубликованным кодом. После устранения этих проблем предложите использовать отладчик, например gdb (в gcc, используйте параметр «-ggdb» как на этапе компиляции, так и на ссылке, так что выходы gdb очень читаемы) и выполните код – user3629249
, вы также можете изменить строку на месте. Просто поменяйте «символы». Вы не уверены, что строки, считанные 'fgetline', вписываются в' line'. – Rptx