Tag: 语言律师

scanf(“%d%d”,&x,&x)是否定义良好?

以下代码是否定义良好? #include int ScanFirstOrSecond(const char *s, int *dest) { return sscanf(s, “%d%d”, dest, dest); } int main(void) { int x = 4; ScanFirstOrSecond(“5”, &x); printf(“%d\n”, x); // prints 5 // Here is the tricky bit ScanFirstOrSecond(“6 7”, &x); printf(“%d\n”, x); // prints 7 return 0; } 换句话说, …参数是否有隐含的restrict ? 我发现最适用的C规范是 fscanf函数依次执行格式的每个指令。 ……C11dr§7.21.6.24

“可表示”在C11中意味着什么?

根据C11 WG14草案版本N1570 : 头文件声明了几个对字符分类和映射有用的函数。 在所有情况下,参数都是一个int ,其值应表示为unsigned char或者等于宏EOF的值。 如果参数具有任何其他值,则行为未定义。 是不确定的行为?: #include #include #include int main(void) { char c = CHAR_MIN; /* let assume that char is signed and CHAR_MIN < 0 */ return isspace(c) ? EXIT_FAILURE : EXIT_SUCCESS; } 标准是否允许将char传递给isspace() ( char为int )? 换句话说,转换为int后的unsigned char是否可表示为unsigned char ? 以下是wiktionary定义“可表示”的方式 : 能够代表。 char是否能够表示为unsigned char ? 是的 §6.2.6.1/ 4: […]

fgets()是否返回NULL并且符合短缓冲区?

在unit testing中,包含fgets()的函数在缓冲区大小n < 2时遇到意外结果。 显然这样的缓冲区大小是愚蠢的,但测试正在探索极端情况。 简化代码: #include #include void test_fgets(char * restrict s, int n) { FILE *stream = stdin; s[0] = 42; printf(” errno:%d feof:%d ferror:%d retval:%ps[0]:%d\n\n”, errno, feof(stream), ferror(stream), retval, s[0]); } int main(void) { char s[100]; test_fgets(s, sizeof s); // Entered “123\n” and works as expected test_fgets(s, 1); // fgets() –> NULL, […]