Questions tagged «c»

C是用于系统编程(OS和嵌入式),库,游戏和跨平台的通用编程语言。该标记应与ISO 9899标准(除非另有说明,最新版本9899:2018中定义的有关C语言的一般问题)一起使用-还要使用c89,c99,c11等标记特定于版本的请求。C与C ++截然不同,在没有合理理由的情况下,不应将其与C ++标记结合使用。

12
检查子字符串是否存在于C中的字符串中
我正在尝试检查字符串是否在C中包含子字符串,例如: char *sent = "this is my sample example"; char *word = "sample"; if (/* sentence contains word */) { /* .. */ } 用什么代替string::findC ++?
169 c  string 

13
C“ int”的大小是2个字节还是4个字节?
C中的Integer变量占用2个字节还是4个字节?它取决于哪些因素? 大多数教科书都说整数变量占用2个字节。但是,当我运行一个程序打印整数数组的连续地址时,它显示出4的差。
168 c  int  byte 


6
在C语言中,为什么有人在释放指针之前将其转换?
我正在使用旧的代码库,几乎所有对free()的调用都在其参数上使用了强制类型转换。例如, free((float *)velocity); free((float *)acceleration); free((char *)label); 其中每个指针具有对应的(和匹配的)类型。我认为这样做根本没有意义。这是很旧的代码,所以我想知道这是否是K&R的东西。如果是这样,我实际上希望支持可能需要这样做的旧编译器,因此我不想删除它们。 使用这些演员表是否有技术原因?我什至看不出有很多实用的理由来使用它们。在释放数据之前提醒自己数据类型有什么意义? 编辑:这个问题不是另一个问题的重复。另一个问题是该问题的特例,如果亲密的选民会阅读所有答案,我认为这是显而易见的。 Colophon:我给“常量答案”打了勾号,因为这是可能需要这样做的真实理由。但是,关于它是ANSI C之前的自定义(至少在某些程序员中)的答案似乎是在我的情况下使用它的原因。许多人在这里有很多优点。感谢你的贡献。
167 c  pointers  casting 

9
为什么在多线程C或C ++编程中不认为volatile有用?
正如我最近发布的答案所表明的那样,我似乎对volatile多线程编程上下文中的实用程序(或缺少实用程序)感到困惑。 我的理解是:只要变量可以在访问代码的控制流之外更改,则该变量应声明为volatile。信号处理程序,I / O寄存器以及由另一个线程修改的变量都构成了这种情况。 因此,如果您有一个全局int foo,并且foo被一个线程读取,并由另一个线程自动设置(可能使用适当的机器指令),则读取线程会以这种方式看到这种情况,就像看到一个由信号处理程序或由外部硬件条件修改,因此foo应声明volatile(或在多线程情况下,以内存限制的负载访问,这可能是一个更好的解决方案)。 我怎么在哪里错?

9
Windows(Visual C)是否可以替代unistd.h?
我正在将一个为Unix编写的相对简单的控制台程序移植到Windows平台(Visual C ++ 8.0)。所有源文件都包含“ unistd.h”,该文件不存在。删除它,我会抱怨缺少“ srandom”,“ random”和“ getopt”的原型。我知道我可以替换随机函数,而且我很确定自己可以找到/破解一个getopt实现。 但是我敢肯定,其他人也会遇到同样的挑战。我的问题是:Windows是否有“ unistd.h”端口?至少有一个包含本机Windows实现的功能-我不需要管道或分支。 编辑: 我知道我可以创建自己的“ unistd.h”,其中包含我需要的东西的替代品-特别是在这种情况下,因为这是一个有限的集合。但是由于这似乎是一个常见问题,所以我想知道是否有人已经为更大的功能子集完成了工作。 在工作中无法切换到其他编译器或环境-我对Visual Studio感到困惑。
165 c++  c  windows  portability  unistd.h 

18
什么是最快的子串搜索算法?
好的,所以我听起来不像个白痴,我将更明确地说明问题/要求: 针(模式)和干草堆(要搜索的文本)都是C样式的以null终止的字符串。没有提供长度信息;如果需要,必须对其进行计算。 函数应该返回指向第一个匹配项的指针,或者NULL如果找不到匹配项。 失败案例是不允许的。这意味着具有非恒定(或大常数)存储要求的任何算法都将需要具有备用失败分配的备用情况(备用备用的性能因此会导致最差情况的性能)。 尽管也可以很好地描述不带代码的算法(或指向该算法的链接),但是实现应使用C语言。 ...以及“最快”的意思: 确定性O(n)其中n=干草堆长度。(但是,O(nm)如果将它们与更鲁棒的算法结合使用以给出确定性的O(n)结果,则可以使用通常是正常的算法(例如滚动哈希)中的思想)。 永远不要表现出if (!needle[1])比朴素的蛮力算法更糟的性能(可测量;几个时钟等等都可以),特别是在很短的针上,这可能是最常见的情况。(无条件的大量预处理开销是不好的,因为试图以可能的针头为代价来提高病理性针头的线性系数)。 与任意其他广泛使用的算法相比,给定任意的针头和干草堆,其性能可比或更高(搜索时间长于50%以上)。 除了这些条件,我将保留“最快”开放式的定义。一个好的答案应该可以解释为什么您考虑您建议的“最快”方法。 我的当前实现比glibc的双向实现大约慢10%至快8倍(取决于输入)。 更新:我当前的最佳算法如下: 对于长度为1的针,请使用strchr。 对于长度为2-4的针,请使用机器字一次比较2-4个字节,如下所示:将针以16位或32位整数进行预加载并进行位移位,并在每次迭代时从干草堆中循环出旧字节/新字节。干草堆的每个字节仅被读取一次,并检查0(字符串末尾)和一个16位或32位比较。 对于长度> 4的针,请使用双向算法以及一个错误的移位表(例如Boyer-Moore),该表仅应用于窗口的最后一个字节。为了避免初始化1kb表的开销(这对于许多中等长度的针头来说都是净损失),我保留了一个位数组(32字节)来标记移位表中的哪些条目已初始化。未设置的位对应于从未出现在机针中的字节值,因此可能会发生全针长移位。 我想到的主要问题是: 有没有一种方法可以更好地利用不良转移表?Boyer-Moore通过向后扫描(从右到左)来最好地利用它,但是双向方法需要从左到右扫描。 对于一般情况(没有内存不足或二次性能条件),我发现的仅有的两种可行的候选算法是有序字母表上的双向匹配和字符串匹配。但是是否存在容易检测到的情况,其中不同的算法将是最佳选择?当然,空间算法中的许多O(m)(m针长在哪里)都可以使用m<100。如果对可证明只需要线性时间的针进行简单的测试,也可以使用最坏情况的二次方算法。 奖励积分: 您可以假设针和干草堆都是格式正确的UTF-8来提高性能吗?(具有变化的字节长度的字符,良好的格式会在针和干草堆之间提出一些字符串对齐要求,并在遇到不匹配的头字节时允许自动2-4字节移位。但是这些约束是否可以为您带来很多/其他好处?最大的后缀计算,良好的后缀移位等已经为您提供了各种算法?) 注意:我很清楚那里的大多数算法,只是他们在实践中表现不佳。这是一个很好的参考,所以人们不会一直给我关于算法的参考作为评论/答案:http : //www-igm.univ-mlv.fr/~lecroq/string/index.html
165 c  algorithm  string  substring 

4
为什么要我++;一世 - ; 彼此对吗?
我查看的是1997年发布的nmap的源代码,我注意到这段代码对我来说有点奇怪: int i=0, j=0,start,end; char *expr = strdup(origexpr); ports = safe_malloc(65536 * sizeof(short)); i++; /* <<<<<< */ i--; /* <<<<<< */ for(;j < exlen; j++) if (expr[j] != ' ') expr[i++] = expr[j]; expr[i] = '\0'; 为什么你们会彼此i++;紧接着i--;又互相拥有?i是0,则i++轮流i到1。在那之后,i--变成i到0。 链接到原始源代码。搜索: i++; i--; 谁能解释这是什么意思?
164 c  nmap 

20
“ for(;;)”比“ while(TRUE)”更快吗?如果没有,人们为什么要使用它?
for (;;) { //Something to be done repeatedly } 我已经看到这种东西使用了很多,但是我觉得这很奇怪……说起来不是那么清晰while(true),或者类似的话吗? 我猜想(这是许多程序员诉诸密码的原因),这快一点点吗? 为什么,真的值得吗?如果是这样,为什么不这样定义呢? #define while(true) for(;;) 另请参阅:哪个更快:while(1)或while(2)?

4
警告:内置函数“ xyz”的隐式声明不兼容
编译一些二进制文件时,我收到许多这样的警告: warning: incompatible implicit declaration of built-in function ‘strcpy’ warning: incompatible implicit declaration of built-in function ‘strlen’ warning: incompatible implicit declaration of built-in function ‘exit’ 为了解决这个问题,我添加了 #include <stdlib.h> 除了使用以下标志进行编译之外,还位于与此警告相关的C文件的顶部: CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc 我正在使用GCC 4.1.2: $ gcc --version gcc (GCC) 4.1.2 20080704 我应该怎么做才能解决这些警告?
164 c  gcc  gcc-warning 


24
__FILE__宏显示完整路径
__FILE__C中可用的标准预定义宏显示了文件的完整路径。有什么办法可以缩短这条路吗?我的意思不是 /full/path/to/file.c 我懂了 to/file.c 要么 file.c
164 c  file  macros  path 

5
gcc的__attribute __((packed))/ #pragma pack是否不安全?
在C语言中,编译器将按声明的顺序对结构的成员进行布局,并在成员之间或最后一个成员之后插入填充字节,以确保每个成员正确对齐。 gcc提供了语言扩展名,__attribute__((packed))它告诉编译器不要插入填充,从而使结构成员无法对齐。例如,如果系统通常要求所有int对象具有4字节对齐,则__attribute__((packed))可能导致int以奇数偏移量分配结构成员。 引用gcc文档: “ packed”属性指定变量或结构字段应具有最小的对齐方式-变量一个字节,一个字段一位,除非您使用“ aligned”属性指定更大的值。 显然,使用此扩展名可能会导致数据需求较小,但代码速度却很慢,因为编译器必须(在某些平台上)生成代码以一次访问一个未对齐的成员一个字节。 但是,在任何情况下这都不安全吗?编译器是否总是生成正确的(尽管速度较慢)代码以访问打包结构中未对齐的成员?是否在所有情况下都可能这样做?
164 c  gcc  pragma-pack 

13
D是Java和C ++的可靠替代品吗?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 D语言是否可以替代Java和C ++?成为可信的替代方案将需要什么?我应该学习吗?它值得传福音吗? 我要问的主要原因是,几乎在这里有了新的C ++标准(c ++ 0x),对于我来说,很明显,对于任何了解它的人,该语言已经远远超过了无回报的地步。我知道C / C ++永远不会消失,但是在某些时候我们需要继续前进。甚至COBOL时代已经到来,Java在许多方面都放弃了C ++。下一个是什么?D会付账吗?
163 java  c++  c  d 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.