Tag: c89

K&R练习1.16 – 线路长度限制

我正在从K&R的“ The C Programming Language ”一书中学习C 语言 。 我正在做本书中指定的练习。 我的运动编号为1.16,但我不明白。 练习1.16: 修改最长行程序的主程序,以便正确打印任意长输入行的长度,并尽可能地打印文本。 我的问题: “……文本尽可能多……” – 字符串长度是否存在一些限制? 也许在标准头文件中有一个变量,其中包含字符串长度的最大允许值? “……任意长输入行的长度……” – 但代码MAXLINE定义为1000.它的大小也是有限的。 我在这里看到了一些解决方案,但在我看来,这不是解决方案的决定,因为前者对行的长度有限制(1000个字符)。 也许我不明白这个任务。 我的理解是我必须删除1000个字符的限制。

如何在Visual Studio中“模拟”C99以进行变量声明

我正在使用Visual Studio 2012开发简单的Win32 C程序。 我知道VS编译器只支持C89,但我想知道是否有办法覆盖这个限制。 特别是我想在我的代码中的任何地方声明变量,而不是仅在范围块的开头声明(如C89所要求的)。 提前致谢。

(void)var实际上做了什么?

考虑以下main() : int main(int argc, char *argv[]) { return (0); } 在使用cc -Wall -Wextra编译时,会生成警告“未使用的参数”。 当我不需要在函数中使用参数时(例如在不使用其int参数的信号处理函数中),我习惯于执行以下操作: int main(int argc, char *argv[]) { (void)argc; (void)argv; return (0); } (对于那个特定的main() ,我有时会看到其他人这样做: argv = argv – argc + argc ) 但是(void)var实际上做了什么? 我知道(void)是一个演员,所以我想我正在抛弃变量? 变量是什么var; 线(没有演员)呢? 这是一个空任务,一个空表达式? 我想了解究竟发生了什么。

如何在普通C89中读取字符长度的UTF-8字符串?

我正在用普通的C89编写一个自定义的跨平台简约TCP服务器。 (但我也会接受POSIX特定的答案。) 服务器使用UTF-8字符串,但从不查看它们。 它将所有字符串视为不可变二进制blob。 但是现在我需要接受来自客户端的UTF-8字符串,它不知道如何以字节为单位计算它们的大小。 客户端只能以字符forms传输字符串长度。 (更新:客户端使用JavaScript,实际上,“字符长度”是String.length()返回的任何内容。我假设它是实际的UTF-8字符,而不是其他字符。) 我不想在我的servlets器上添加大量依赖项。 有没有一种强大而简洁的方法来读取这个数据报? (为了这个问题,让我们说它是从FILE *读取的。) U ; data type marker (actually read by dispatching code) ; UTF-8 string size in characters ; data blob 例: U 7 Юникод! 更新: 一批数据可以包含多个数据报,因此近似读取不起作用,我需要读取确切数量的字符。 实际的UTF-8数据可能包含任何字符,因此我不能选择一个字符作为终结符 – 我不想在数据中转移它。

C89 vs c99 GCC编译器

如果我使用c89和c99编译以下程序有区别吗? 我得到相同的输出。 两者之间真的有区别吗? #include int main () { // Print string to screen. printf (“Hello World\n”); } gcc -o helloworld -std=c99 helloworld.c vs gcc -o helloworld -std=c89 helloworld.c

C90:如何在没有C99扩展的情况下在C中全局初始化此结构

我想知道用C90初始化这个结构的最好方法是什么,同时仍保持整洁。 在我的头文件中,将其命名为test.h,我定义了以下结构: struct s_test_cfg{ char *a[3]; char *b[3]; char *c[3]; } 然后我将它声明为extern结构,以便我可以在.c文件中全局初始化它: extern struct s_test_cfg test_cfg; 现在在我的.c文件中,我希望能够在全局范围内声明这样的东西(显然我要编写的内容在C90中不受支持): struct s_test_cfg test_cfg = { .a = {“a”, “b”, “c”},\ .b = {“d”, “e”, “f”},\ .c = {“g”, “h”, “i”} }; 这显然使你对你想要做的事情非常整洁和透明。 如何初始化我的C文件中的全局结构,该结构也像这种语法一样干净? 谢谢。

尝试使用C qsort函数时出现问题

#include #include float values[] = { 4, 1, 10, 9, 2, 5, -1, -9, -2,10000,-0.05,-3,-1.1 }; int compare (const void * a, const void * b) { return ( (int) (*(float*)a – *(float*)b) ); } int main () { int i; qsort (values, 13, sizeof(float), compare); for (i = 0; i < 13; i++) { […]

人们使用什么技术/策略来构建C(而不是C ++)中的对象?

我特别感兴趣的是在C语言中使用的对象,而不是构成解释语言核心的对象的实现,例如python。

GNU89,混合声明和循环初始声明

GCC和ICC的默认C语言是GNU89。 GNU89允许混合声明,例如 int i; i = 0; int j; 我推断(错误地)来自SO上的一些其他post,例如C:for loop int initial declaration ,这意味着我可以做到 for(int i=0; i<n; i++) 使用GNU89但是当我这样做时,我得到了 error: ‘for’ loop initial declarations are only allowed in C99 mode 显然,混合声明和循环初始声明不是一回事(即一个并不暗示另一个)。 如果我只能有一个,我宁愿有循环初始声明。 当然,我可以使用GNU99,但这不是重点。 默认值是GNU89,它已经破坏了一些C89规则(它还允许BCPL / C ++样式注释)。 是否存在允许混合声明而不是循环初始声明的一些基本原因?

是否有一种类型安全的方法来获取C中数组的元素数?

在C中获取数组元素的通常方法是这样的: #define COUNTOF(arr) (sizeof(arr) / sizeof(arr[0])) 这导致了一个整数常量表达式,这也是一个非常好的加号。 问题是它不是类型安全的: int* i; COUNTOF(i); /* compiles 🙁 */ int* i; COUNTOF(i); /* compiles 🙁 */ int* i; COUNTOF(i); /* compiles 🙁 */ 。在实践中,这应该很少出现,但为了正确起见,这将是很好的使这种类型安全。 在C ++ 03中,这很容易(在C ++ 11中,它更容易,留给读者练习): template char (&countof_detail(T (&)[N]))[N]; // not defined #define COUNTOF(arr) (sizeof(countof_detail(arr))) 这使用模板推导来获得N ,即数组的大小,然后将其编码为类型的大小。 但在C语言中,我们没有获得该语言function。 这是我做的小框架: // if `condition` evaluates to 0, […]