我正在尝试为字符制作一个 RLE(游程编码器)程序。我在网上的笔记上阅读了它的工作方式。我尝试修复我的代码!不管我认为代码的步骤是正确的,代码都不起作用!它运行时出现一些奇怪的“Z”。我实在找不到哪里出了问题!您能给我一个建议吗?

#include <stdio.h>

int main()
{
    int count;
    unsigned char currChar,prevChar=EOF;
    while(currChar=getchar() != EOF)
    {
        if ( ( (currChar='A')&&(currChar='Z') ) || ( (currChar='a')&&(currChar='z') ) )
        {
            printf("%c",currChar);
            if(prevChar==currChar)
            {
                count=0;
                currChar=getchar();
                while(currChar!=EOF)
                {
                    if (currChar==prevChar)
                        count++;
                    else
                    {   
                        if(count<=9)
                            printf("%d%c",count,prevChar);
                        else
                        {   
                            printf("%d%c",reverse(count),prevChar);
                        }                       
                        prevChar=currChar;
                        break;
                    }
                }
            }
            else
                prevChar=currChar;

            if(currChar==EOF)
            {   printf("%d",count);
                break;
            }
        }
        else
        {
            printf("Error Message:Only characters are accepted! Please try again! False input!");
            break;
        }
    }
    return 0;
}

int reverse(int x)
{
    int p,y,r=0;
    x=(x<0)?-x:x;
    while (x>0)
    {
        y=x%10;
        p=x/10;
        r=10*r+y;
        x=p;
    }
    printf("%d",r);
    return 1;
}

例如我给出了输入:

AAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEGGGGGGGGGGGGGGGGVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRHD RRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMS TTTTTTTTTTHHHHHHHHHHHH

我得到了输出:

Z0AZZ0AZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0GZZ0GZZ0GZZ0GZZ0GZZ0GZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0RZZ0RZZ0RZZ0RZZ0 ZZ0RZZ0RZZ0RZZ0RZZ0RZZ0RZZ0HZZ0HZZ0HZZ0HZZ0HZZ0HZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :(

有帮助吗?

解决方案

将以前的评论转换为答案...

  • 正如其他答案中指出的那样,“if”条件中的赋值存在问题。

  • 您不能将值赋给 unsigned char,然后期望检测到 EOF。忘记名字 - 记住 getc() 和 getchar() (和 fgetc())返回一个整数,而不是一个字符;他们必须返回一个整数,因为他们需要返回每个可能的有效字符值加上 EOF!

  • 您的测试时间为 if(currChar=='EOF') 很奇怪。您使用的是多字符常量,该常量最多是实现定义的,并且不会等于 getchar() 返回的 EOF(不带引号)。另外 currChar 的类型是错误的。

  • verse() 总是返回 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 ;
}

其他提示

看这个行:

if ( ( (currChar='A')&&(currChar='Z') ) || ( (currChar='a')&&(currChar='z') ) )

要分配“A”到currChar然后要分配“Z”到currChar等等...

您需要更改===使它比较,而不是分配。

另外,你这是什么意思(currChar='A')&&(currChar='Z')currChar不能是“A”,并在同一时间“Z”,我相信你的意思把这里是为currChar包括在一定的时间间隔进行检查。因此,也许应该是:

(currChar>='A')&&(currChar<='Z')

这同样适用于您的条件的第二部分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top