【发布时间】:2015-09-10 09:54:44
【问题描述】:
我正在尝试这样做:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_SIZE 50
int main()
{
char *s = malloc(sizeof(char)*MAX_SIZE);
do{
int r = read(STDIN_FILENO, s, MAX_SIZE);
if(r==-1) printf("error ");
else{
write(STDERR_FILENO, s, MAX_SIZE);
}
while(getchar()!='\n');
} while(strcmp(s,"end\n")!=0);
free(s);
return 0;
}
我的问题是:在这种情况下 fflush(stdin) 是未定义的行为吗? 当我在互联网上搜索时,我读到 fflush(stdin) 是一种已定义的行为: 通过标准 C 将输入流传递给 fflush 是一种未定义的行为...... STDIN 是输入流(缓冲) 我认为未定义的行为是标准 C 未指定在特定情况下必须具有特定功能的行为。
所以遵循标准 C 是一种未定义的行为,对吗?
那么在这种情况下是未定义的行为吗?
【问题讨论】:
-
混合 stdio 库和使用原始文件描述符不是一个好主意。
-
这个问题很不清楚。您已经展示了一些不使用
fflush并且充满了不相关的干扰的代码,malloc和free没用(只需使用char s[50]),MAX_SIZE没用,sizeof(char)没用等等。此外,“问题”是同一件事重复 3 或 4 次,措辞略有不同,标点符号差,然后你再问同样的问题两次。难道整个事情就不能简单地称为“fflush(stdin)未定义的行为吗?”并摆脱所有其余的?! -
为什么是个坏主意? @Ed 治愈
-
因为 stdio 使用缓冲区,原始指针不使用。事情变得混乱。
-
因为
sizeof(char)在所有系统上始终为 1,所以您只需写 1。这样更简单。您的示例可能只使用了char s[MAX_SIZE];而根本不需要 malloc、free 或 sizeof(char)。