在给我的可执行程序一个txt文件的情况下,我对我的C程序感到困惑

7kqas0il  于 2023-05-16  发布在  其他
关注(0)|答案(1)|浏览(93)

我想从文本文件中计数每个ASCII字符的数量。所以我编写了一个可以读取文本文件的C文件。这是我的C源代码。

#include <stdio.h>
int main()
{
       /*c언어 소스파일을 컴파일 한 뒤 ./{실행파일명}<{넣어줄 파일명}으로 터미널에 입력하면 파일의 내용이 input으로 들어간다.
    어떠한 자료구조에 넣어주는 것이 효율적일 것인가? ==> 그냥 무식하게 하나하나 다 세는 방법도 있긴 함. 

    */
   int myAsciiList[128]={0,};//나올 때마다 더해줄 아스키 코드임.
   char gettingChar;//매번 입력받을 것을 말한다.
   scanf("%c",&gettingChar);//먼저 파일로부터 문자를 하나 입력 받는다.
   int myIndex;
   myIndex=gettingChar;
   myAsciiList[myIndex]++;
   while(1)//계속해서 입력을 받아들인다.
   {
       scanf("%c",&gettingChar);
       if(gettingChar==EOF) break;
       else{
              myIndex=gettingChar;
              myAsciiList[myIndex]++;
       }
   }
   
   return 0;
}

我用Visual Studio Code编译了我的C源代码并制作了可执行文件。然后我给我的文本文件在终端命令**"./count < input.txt”**.
但是我的终端什么都没有显示。像这样,MacBookAir ~/Desktop/2023_Algorithm/hw 4 main ±./count < test.txt
你能给我推荐一下如何修改我的代码吗?😂

osh3o9ms

osh3o9ms1#

1.使用符号常量LEN代替硬编码的魔法值。特别是当你需要在两个地方使用同一个变量时。
1.(不固定)考虑使用unsigned类型(如unsignedsize_t)而不是(有符号)int作为myAsciiList。这更好地捕获了正计数的意图。
1.如果charsignedunsigned,则它的实现定义。如果它是有符号的,负值将导致缓冲区下溢。您还假设小于128,否则将导致缓冲区溢出。
1.循环之前的代码与循环中的代码相同。这可能是个错误。另外,在循环之前,你没有实现错误处理,这是有问题的(如果它工作的话)。消除重复代码是个好主意。在这种情况下,我可以删除它,其他时候将重复的代码移动到函数中,并根据需要多次调用该函数。

  1. scanf()返回EOF。它不会将变量gettingChar设置为它。
    1.如果你想要输出,你需要打印一些东西。
    1.尽可能减少变量的数量和范围。char ch;现在在使用前声明。myIndex被删除,因为它与ch和下面的值相同,我在需要时将其转换为无符号值。
    1.(不固定)打印结果时,请考虑对不可打印字符(如空格、换行符或制表符)的特殊处理。
    你可能需要一些沿着的东西:
#include <stdio.h>

#define LEN 128

int main() {
    int myAsciiList[LEN] = {0};
    for(;;) {
        char ch;
        int rv = scanf("%c", &ch);
        if(rv == EOF)
            break;
        if(!rv) {
            printf("scanf failed\n");
            break;
        }
        if((unsigned) ch >= LEN) {
            printf("ch is too large\n");
            break;
        }
        myAsciiList[(unsigned) ch]++;
    }
    for(size_t i = 0; i < LEN; i++) {
        if(myAsciiList[i])
            printf("%c: %d\n", (char) i, myAsciiList[i]);
    }
}

下面是一个使用源文件作为输入运行的示例:

$ ./count < count.c
        : 41

: 26
 : 38
!: 1
": 8
#: 2
%: 3
&: 1
(: 14
): 14
+: 4
,: 3
.: 1
0: 2
1: 1
2: 1
8: 1
:: 1
;: 14
<: 2
=: 6
>: 2
A: 4
E: 5
F: 1
L: 8
N: 4
O: 1
[: 4
\: 3
]: 4
_: 1
a: 10
b: 3
c: 16
d: 7
e: 11
f: 13
g: 3
h: 8
i: 37
k: 3
l: 3
m: 5
n: 18
o: 5
p: 3
r: 14
s: 15
t: 13
u: 3
v: 3
y: 4
z: 1
{: 6
}: 6

相关问题