c - 为什么 printf 被调用两次?甚至看起来是随机的?
问题描述
我正在尝试制作读取 .bin 文件并找到“人造字符”的程序。我没有走多远,因为每次我尝试打印找到的字符的缓冲区时,它都会打印两次,或者打印我不应该打印的那些。我发现只有fflush(stdout)打印一次。现在我试图将它打印为字符串printf(%s, buffer)并且我试图用for()来做它(没有工作)。现在我不知道该怎么办。
int main(int argc, char** argv) {
int l = 3;
if(argc >= 2){
l = atoi(argv[1]);
}
char* buffer = (char*) malloc((l + 1) * sizeof(char));
int ch;
int i = 0;
while ((ch=getchar()) != EOF) {
if (i == l) {
buffer[i] = '\0';
printf("%s", buffer);
i = 0;
}
if (ch >= ' ' && ch <= '~') {
buffer[i] = putchar(ch);
i++;
} else {
printf("\n");
i = 0;
}
}
return 0;
}
解决方案
你乱跑的原因是因为你没有跳出while
循环。这是应该的代码break
。
if (i == l) {
buffer[i] = '\0';
printf("%s", buffer);
i = 0;
}
因此,在你戴上右括号之前,请跳出 while 循环。您不再需要 while 循环。这是修改后的if
块:
if (i == l) {
buffer[i] = '\0';
printf("%s", buffer);
i = 0;
break;
}
因为你没有加入 break ,所以它跳到了else
.
推荐阅读
- flutter - Flutter:按下按钮时只能在初始化程序中访问静态成员
- mongodb - 需要在mongodb中查找动态多个嵌套集合的查询
- android - 未解决的类:主要活动
- android - 使用 Volley 在 kotlin 中创建 Reqeust 类
- javascript - 使用 Node.js 启动带有参数的浏览器窗口
- sql-server - “一个 SQL server Express 2008 实例是 sqlserver.exe 可执行文件的副本”是什么意思?
- sql - 不确定为什么会出现 ORA-00918 列定义不明确
- python-3.x - 'pytest.mark.asyncio' 用于什么用途?
- ssl - Cloudflare 'Origin Certificates' 的通配符证书不适用于 Azure webApps
- session - 多次调用事件总线订阅方法