我一直试图将这个问题弄好这么久,我发现我最困惑的部分是我应该使用已经在另一个程序中定义并制作的函数的部分,但是我应该在我的新程序中保持不变的程序(对不起,如果这没有意义)。但是这里的程序已经定义了我们假设在我们的程序中使用的函数:
#ifndef COMMON_H
#define COMMON_H
#include <stdlib.h>
/* constants: number of different characters, and
first and last printable characters */
#define NUM 128
#define FIRST '!'
#define LAST '~'
/* symbols for special characters, corresponding to codes 0 through FIRST-1 */ char *symbols[] = {"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK",
"BEL", "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI", "DLE", "DC1",
"DC2", "DC3", "DC4", "NAK", "SYN", "ETB", "CAN", "EM", "SUB", "ESC",
"FS", "GS", "RS", "US", "SPC" };
/* symbol for DEL character, code LAST+1 (same as NUM-1) */ char
*symbolDel = "DEL";
/* the following four functions must be used to print results */
/* use prHeader at the start to print header row (titles) */ void prHeader(FILE *out) {
fprintf(out, "Code\tChar\tCount\n----\t----\t-----\n"); }
/* use prCountStr to print count for one of the special symbols */ void prCountStr(FILE *out, int code, char *str, int count) {
fprintf(out, "%3d\t%s\t%5d\n", code, str, count); }
/* use prCountChr to print count for one of the printable characters
*/ void prCountChr(FILE *out, int code, char chr, int count) {
fprintf(out, "%3d\t%c\t%5d\n", code, chr, count); }
/* use prTotal at the end to print total character count */ void prTotal(FILE *out, int count) {
fprintf(out, "\t\t-----\nTotal\t\t%5d\n", count); }
/* use the following three macros to print error messages for part 2 {
Beware: each macro executes two statements. } ignore these macros for part 1 */
/* use BADFILE(name) to exit if a file (name) cannot be opened */
#define BADFILE(name) fprintf(stderr, "bad file: %s\n", (name)); \
exit(1);
/* use BADOPTION(op) if an invalid option (not '-o') is on command line */
#define BADOPTION(op) fprintf(stderr, "bad option: %s\n", (op)); \
exit(2);
/* use MISSING (without parens) if output filename is missing */
#define MISSING fprintf(stderr, "missing output file\n"); \
exit(3);
#endif
使用这些定义我应该在收到输入后,打印一个表,这样就显示了字符,ASCII表示,以及该字符出现的次数,如下例所示:
Code Char Count
---- ---- -----
10 LF 3
32 SPC 35
40 ( 1
41 ) 1
45 - 1
46 . 4
58 : 1
68 D 1
72 H 2
73 I 4
79 O 1
84 T 1
编辑代码:
#include <stdio.h>
#include "common.h"
int main(int argc, char *argv[]) {
FILE *in = stdin;
FILE *out = stdout;
int x;
int count1 = 0;
int count2 = 0;
int asciicount[256] = {0};
do
{
x = getchar();
asciicount[x]++;
count1++;
} while (x != EOF);
for (count2; count2<=255; count2++)
{
if (count2<33)
{
prCountStr(out, count2, symbols[count2], asciicount[count2]);
}
else
{
prCountChr(out,count2,x,asciicount[count2]);
}
}
prTotal(out, count1);
prHeader(out);
return 0;
}
/* do
{
if (count2 < '!')
{
prCountStr(out, count2, symbols[count2], asciicount[count2]);
}
else{
prCountChr(out,count2,x,asciicount[count2]);
}
count2++;
} while (count2 <= 255);
prTotal(out, count1);
prHeader(out);
return 0;
}*/
第二部分是我之前所拥有的,但我正在评论并尝试for循环以查看是否可以解决问题。 这是新输出,它一直打印到255,而不计算每次出现的次数或打印ascii代码。
29 GS 0
30 RS 0
31 US 0
32 SPC 0
33 ? 0
34 ? 0
35 ? 0
36 ? 0
37 ? 0
38 ? 0
39 ? 0
40 ? 0
41 ? 0
42 ? 0
答案 0 :(得分:1)
你有正确的想法。但是代码中存在一些语法错误。
您需要#include <stdio.h>
因为FILE,printf等的定义存在。
x
意味着char
,因此您应该将其定义为int x;
。我看到你评论了char x;
。您应该改为do-while
。
do {
//statements
} while (condition);
循环的正确语法是(注意while结束时的分号):
r
if
未定义。
由于;
语句以prCountStr
结尾,else
语句将始终执行,您将在int
后立即收到语法错误
您只需要在函数的定义中包含变量的类型(char
,prCountStr
等),而不是在函数的调用中。例如,调用prCountStr(out, someInt, somePointerToChar, someInt);
的正确方法是
prCountChr
您需要为其定义提供所需数量的函数。这适用于您prTotal
和void
的来电,您将FILE *out, int code, char chr, int count
作为参数传递,但它们分别需要FILE *out, int count
和{{1}}。
我已经包含了对您使用的算法的快速分析以及我在原始答案中提出的解决方案,但意识到这不是您要求的。如果您需要进一步说明,请告诉我