Преобразование предыдущих комментариев в ответ ...
Есть проблемы с назначениями в условиях «если» - как указано в другом ответе.
Вы не можете присвоить значение неподписанному символу и затем ожидать обнаружения EOF. Забудьте имя - помните, что getc () и getchar () (и fgetc ()) возвращают целое число, а не символ; они должны возвращать целое число, потому что они должны возвращать каждое возможное допустимое значение символа плюс EOF!
Ваш тест на if(currChar=='EOF')
странный. Вы используете многосимвольную константу, которая в лучшем случае определяется реализацией, и которая не будет равна EOF (без кавычек), как возвращено getchar (). Плюс неправильный тип currChar.
reverse () всегда возвращает 0; это то, что вы действительно хотели?
Строка 'while(currChar=getchar() != EOF)
' нуждается в дополнительных скобках, чтобы она работала, как и ожидалось: 'while((currChar = getchar()) != EOF)
'. На данный момент он присваивает 0 (NUL, '\ 0') или 1 (Control-A) currChar.
Внутренний цикл while не читает никаких символов, поэтому он отправит вашу программу в бешенство - ему также нужно назначить нотацию 'while((currChar = getchar()) != EOF)
'. Затем вам нужно выяснить, каков ожидаемый результат на самом деле, потому что я не думаю, что это имеет большой смысл - в частности, паразитные 'printf("%c",currChar);
' после основного теста сомнительны - возможно, это отладочная распечатка, которую вы оставили случайно позади.
Вам также необходимо рассмотреть, как код должен обрабатывать такие вещи, как переводы строк - и это еще до того, как мы перейдем к проблемам неоднозначности в выходных данных (как вы узнаете разницу между данными в кодировке RLE и данными, содержащими числовые значения. В вашем алгоритме есть много поводов для беспокойства! В большинстве случаев он некорректен, извините за сообщение.
Вот некоторый полуработающий код; он явно отказывается иметь дело с цифрами (но это все).
/* RLE - Run Length Encoding */
/* SO 2485285 */
/*
** Input: stream of data except for digits 0-9
** Output: stream of data with adjacent sets of 3 or more of the same
** character represented by 3Z (for ZZZ), etc.
*/
#include <stdio.h>
#include <ctype.h>
static void print_rle(int count, int repchar)
{
if (count > 2)
printf("%d%c", count, repchar);
else if (count == 2)
printf("%c%c", repchar, repchar);
else if (repchar != EOF)
printf("%c", repchar);
}
int main()
{
int count = 1;
int currChar;
int prevChar = EOF;
while ((currChar = getchar()) != EOF)
{
if (isdigit(currChar))
fprintf(stderr, "Bogus character %c read - ignored\n", currChar);
else if (currChar == prevChar)
count++;
else
{
print_rle(count, prevChar);
count = 1;
prevChar = currChar;
}
}
print_rle(count, prevChar);
return 0;
}
И это вывод, когда я запускаю его с собственным исходным кодом (обратите внимание, что я использую пробелы, а не символы табуляции). Сообщения «Поддельный символ» печатаются на stderr, а не на stdout.
/* RLE - Run Length Encoding */
Bogus character 2 read - ignored
Bogus character 4 read - ignored
Bogus character 8 read - ignored
Bogus character 5 read - ignored
Bogus character 2 read - ignored
Bogus character 8 read - ignored
Bogus character 5 read - ignored
/* SO */
/*
Bogus character 0 read - ignored
Bogus character 9 read - ignored
** Input: stream of data except for digits -
Bogus character 3 read - ignored
** Output: stream of data with adjacent sets of or more of the same
Bogus character 3 read - ignored
**9 character represented by Z (for 3Z), etc.
*/
#include <stdio.h>
#include <ctype.h>
static void print_rle(int count, int repchar)
{
Bogus character 2 read - ignored
4 if (count > )
8 printf("%d%c", count, repchar);
Bogus character 2 read - ignored
4 else if (count == )
8 printf("%c%c", repchar, repchar);
4 else if (repchar != EOF)
8 printf("%c", repchar);
}
int main()
{
Bogus character 1 read - ignored
4 int count = ;
4 int currChar;
4 int prevChar = EOF;
4 while ((currChar = getchar()) != EOF)
4 {
8 if (isdigit(currChar))
12 fprintf(stderr, "Bogus character %c read - ignored\n", currChar);
8 else if (currChar == prevChar)
12 count++;
8 else
8 {
12 print_rle(count, prevChar);
Bogus character 1 read - ignored
12 count = ;
12 prevChar = currChar;
8 }
4 }
4 print_rle(count, prevChar);
Bogus character 0 read - ignored
4 return ;
}