我想从文本文件中计数每个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
你能给我推荐一下如何修改我的代码吗?😂
1条答案
按热度按时间osh3o9ms1#
1.使用符号常量
LEN
代替硬编码的魔法值。特别是当你需要在两个地方使用同一个变量时。1.(不固定)考虑使用
unsigned
类型(如unsigned
或size_t
)而不是(有符号)int
作为myAsciiList
。这更好地捕获了正计数的意图。1.如果
char
是signed
或unsigned
,则它的实现定义。如果它是有符号的,负值将导致缓冲区下溢。您还假设小于128,否则将导致缓冲区溢出。1.循环之前的代码与循环中的代码相同。这可能是个错误。另外,在循环之前,你没有实现错误处理,这是有问题的(如果它工作的话)。消除重复代码是个好主意。在这种情况下,我可以删除它,其他时候将重复的代码移动到函数中,并根据需要多次调用该函数。
scanf()
返回EOF
。它不会将变量gettingChar
设置为它。1.如果你想要输出,你需要打印一些东西。
1.尽可能减少变量的数量和范围。
char ch;
现在在使用前声明。myIndex
被删除,因为它与ch
和下面的值相同,我在需要时将其转换为无符号值。1.(不固定)打印结果时,请考虑对不可打印字符(如空格、换行符或制表符)的特殊处理。
你可能需要一些沿着的东西:
下面是一个使用源文件作为输入运行的示例: