我正在尝试为角色制作一个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;
}
e.g。 我给出了输入:
AAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEGGGGGGGGGGGGGGGGVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRHD RRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMS TTTTTTTTTTHHHHHHHHHHHH
我得到了输出:
Z0AZZ0AZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0GZZ0GZZ0GZZ0GZZ0GZZ0GZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0RZZ0RZZ0RZZ0RZZ0 ZZ0RZZ0RZZ0RZZ0RZZ0RZZ0RZZ0HZZ0HZZ0HZZ0HZZ0HZZ0HZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :(
答案 0 :(得分:3)
看看这一行:
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')
同样适用于你病情的第二部分。
答案 1 :(得分:2)
将先前的评论转换为答案......
“if”条件中的分配存在问题 - 正如另一个答案中所指出的那样。
您无法为unsigned char指定值,然后期望检测EOF。忘记名字 - 记住getc()和getchar()(和fgetc())返回一个整数,而不是一个char;他们必须返回一个整数,因为他们需要返回每个可能的有效字符值加上EOF!
您在if(currChar=='EOF')
的考试很奇怪。您使用的是多字符常量,它最多是实现定义的,并且不等于getchar()返回的EOF(未引用)。加上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;
}
这是我在自己的源代码上运行时的输出(注意我使用空格,而不是制表符)。 'Bogus character'消息打印在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 ;
}