对于一个项目,我试图从键盘输入一个输入,并创建一个表格,显示出现的某些字符的次数。以下是说明:
“读取标准输入中的字符,直到读取EOF(文件结束标记)。不要提示用户输入文本 - 只需在程序启动时读取数据即可。 保持输入中遇到的每个不同字符的运行计数,并记录输入的字符总数(不包括EOF)。
注意总共有128个ASCII码,等于common.h中定义的符号常量NUM的值。熟悉common.h的功能 - 其中很多都很方便,你需要在后面的步骤中使用其中的一些。
打印一张整齐的表格,显示每个不同的输入代码,相应的字符及其计数,并在结尾处打印总计数。不要为输入文本中未包含的ASCII代码打印任何行。
您必须完全匹配我们解决方案的基本结果的格式,因此您必须使用common.h中定义的符号和函数。不要以任何其他方式打印任何东西。
一开始就使用prHeader一次。
对与特殊字符(代码0-32和127)对应的每一行使用prCountStr,以及 使用common.h中提供的符号字符串。
对与可打印字符对应的每一行使用prCountChr(代码33-126)。
最后一次使用prTotal。
您可以通过手动输入文本来测试它,在这种情况下,您必须在Linux上输入ctrl-D(或Windows上的ctrl-Z)以结束输入。或者更好,通过使用Linux重定向运算符('<')重定向文件来测试它。例如,要在我们的第二个示例运行中输入名为sample.txt的示例文本文件,请注意我们输入了以下内容: “
这是我到目前为止的代码:
int main(int argc, char *argv[])
{
int i=0,i2=0, totalCount=0;
char character, counter[10000]={0};
int shownArray[NUM]={0};
FILE *out;
out = fopen(OUTPUT, "w");
prHeader(out);
if (out == NULL)
{
printf("ERROR opening files. \n");
return 1;
}
else
{
printf("SUCCESS opening files. \n");
while (scanf("%c", &character) != EOF)
{
counter[totalCount++] = character;
printf("%c", character);
}
for(i=0; i<NUM;i++)
{
for(i2=0;i2<=totalCount;i2++)
{
if(shownArray[i] == (int)counter[i2])
shownArray[i]++;
}
}
for(i=0; i<NUM; i++)
{
if(shownArray[i]>0)
{
if(i <= 32)
{
prCountStr(out,i,symbols[i],shownArray[i]);
}
else if(i == 127)
{
prCountStr(out,i,symbolDel,shownArray[i]);
}
else
{
char c=i;
prCountChr(out, i,c, shownArray[i]);
}
}
}
prTotal(out,totalCount);
}
fclose(out);
return 0;
}
这是common.h
/*
common.h - include at start of counts.c for
Use the constants, symbols, macros and functions herein to
insure that your printed results accurately match our
solution's results. Do not print by any other means.
Do not change this file, and especially do not rely on any
changes to it. You will not turn this file in.
*/
#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
在函数中输入短语“hello”时,这是我的输出文件:
Code Char Count
---- ---- -----
0 NUL 1
1 SOH 1
2 STX 1
3 ETX 1
4 EOT 1
5 ENQ 1
6 ACK 1
7 BEL 1
8 BS 1
9 HT 1
10 LF 1
11 VT 1
12 FF 1
13 CR 1
14 SO 1
15 SI 1
16 DLE 1
17 DC1 1
18 DC2 1
19 DC3 1
20 DC4 1
21 NAK 1
22 SYN 1
23 ETB 1
24 CAN 1
25 EM 1
26 SUB 1
27 ESC 1
28 FS 1
29 GS 1
30 RS 1
31 US 1
32 SPC 1
33 ! 1
34 " 1
35 # 1
36 $ 1
37 % 1
38 & 1
39 ' 1
40 ( 1
41 ) 1
42 * 1
43 + 1
44 , 1
45 - 1
46 . 1
47 / 1
48 0 1
49 1 1
50 2 1
51 3 1
52 4 1
53 5 1
54 6 1
55 7 1
56 8 1
57 9 1
58 : 1
59 ; 1
60 < 1
61 = 1
62 > 1
63 ? 1
64 @ 1
65 A 1
66 B 1
67 C 1
68 D 1
69 E 1
70 F 1
71 G 1
72 H 1
73 I 1
74 J 1
75 K 1
76 L 1
77 M 1
78 N 1
79 O 1
80 P 1
81 Q 1
82 R 1
83 S 1
84 T 1
85 U 1
86 V 1
87 W 1
88 X 1
89 Y 1
90 Z 1
91 [ 1
92 \ 1
93 ] 1
94 ^ 1
95 _ 1
96 ` 1
97 a 1
98 b 1
99 c 1
100 d 1
101 e 1
102 f 1
103 g 1
104 h 1
105 i 1
106 j 1
107 k 1
108 l 1
109 m 1
110 n 1
111 o 1
112 p 1
113 q 1
114 r 1
115 s 1
116 t 1
117 u 1
118 v 1
119 w 1
120 x 1
121 y 1
122 z 1
123 { 1
124 | 1
125 } 1
126 ~ 1
127 DEL 1
-----
Total 5
我被困的地方是每个角色都说它出现一次,无论它实际出现多少次。感谢任何可以提供帮助的人,对不起,这是一个很长的问题。
答案 0 :(得分:1)
替换它:
if(shownArray[i] == (int)counter[i2])
有了这个:
if(i == counter[i2])
您希望将索引用作要检查的值,而不是它出现的次数。那是后来的事。
还有:
for(i2=0;i2<=totalCount;i2++)
应该是这样的:
for(i2=0;i2<totalCount;i2++) // note strictly less-than
答案 1 :(得分:0)
只需添加更改以下代码:
prHeader(out);
if (out == NULL)
{
printf("ERROR opening files. \n");
return 1;
}
TO:
if (out == NULL)
{
printf("ERROR opening files. \n");
return 1;
}
else
{
prHeader(out);
.
.
.
}
因为如果FILE
无法在标题文件功能中打开您的NULL
检查,这将导致runtime error