C 在循环条件中使用strlen()是否比只检查空字符慢?

我已经读到使用strlen比这样的测试更昂贵: int len = strlen(x); for (int i = 0; i < len; i++) 我们有一个字符串x100个字符长 我认为 for (int i = 0; i < strlen(x); i++) 这是真的吗?也许第二个代码在某些情况下不起作用,那么使用第一个更好吗 使用以下选项会更好吗 for (char *tempptr = x; *tempptr != '\0'; tempptr++) 第一个代码在i的每次

将一个结构指针转换为另一个-C 请考虑以下代码。 enum type {CONS, ATOM, FUNC, LAMBDA}; typedef struct{ enum type type; } object; typedef struct { enum type type; object *car; object *cdr; } cons_object; object *cons (object *first, object *second) { cons_object *ptr = (cons_object *) malloc (sizeof (cons_object)); ptr->type = CONS; ptr->car = first; ptr->cdr = second; return (object *) ptr; }

在cons函数中,变量ptr的类型为cons\u object*。但在返回值中,它被转换为对象的类型* 我想知道这是怎么可能的,因为cons\u object和object是不同的结构 这样做有什么问题吗 任何想法 这很好,是在C中实现“面向对象”的一种相当常见的技术。因为structs的内存布局在C中定义得很好,只要两个对象共享相同的布局,就可以在它们之间安全地强制转换指针。也就是说,类型成员在对象结构中的偏移量与在cons_对象结构中的偏移量相同 在本例中,类型成员告诉API该对象是cons

在C中向pthreads发送和捕获信号

我知道如何使用kill(pid\utpid,intsig)函数向C中的子进程发送信号。向线程发送信号怎么样?可能吗?。如果是这样,如何捕捉“子”线程上的信号。例如,如果主线程向我发送终止信号,我如何在另一个线程中捕获它 我不确定这是否可行,因为这取决于平台和实现,我强烈建议您不要使用信号在线程之间进行通信。有时只有一个特定线程接收信号,有时所有线程都接收信号 存在更好的线程通信机制,如队列、信号量和锁。信号没有线程亲和力。它们是完全异步处理的。使用signal(2)或sigaction(2)指定

C 向tm结构添加一些间隔

我有一个struct tm。 我需要增加一些固定的时间间隔(以xx年,xx月,xx天为单位) 到tm结构。 有没有标准的函数来实现这一点 我使用的编译器是Windows XP上的MSVC 2005。标准加法运算符可以工作 struct tm x; /* add 2 years and 3 days to x */ x.tm_year += 2; x.tm_mday += 3; 编辑:您可以轻松创建函数 struct tm addinterval(struct tm x, int y, int

C 如何获取流程信息?

在我的操作系统类中,我们用C语言编程,我们重写了计时器中断,在我们编写的计时器中断之后,我们必须处理4个进程,但我们需要获取进程的上下文,如指令指针、数据段等。我们如何从C语言中获取这些信息?如果不是,我们是否也需要在C代码中使用ASM?谢谢:D 我正在使用Windows XP 32位的virtual box,并且使用DOS 16位虚拟机,您可能需要使用汇编代码来执行上下文保存/还原,除非您已经实现了诸如getcontext之类的库例程。是,你至少需要一点汇编语言。典型的起点是pusha。这样可

C 在32位系统上存储2个以上电源31

我必须编写一个程序,可以计算2power2010的幂,并找到数字的和。例如: if `2 power 12 => gives 4096 . So 4+0+9+6 = 19 . 现在我需要为2 power 2010找到相同的版本。 请帮助我理解。您必须使用提供无限整数长度类型的库(请参阅),或者实现不需要这些类型的解决方案(例如,使用数字阵列并自行在阵列上实现功率计算,在您的情况下,这可以像循环中的加法一样简单)。既然这是家庭作业,可能是后者。知道2^32,你会如何用笔和纸计算2^33

C 如何从无限循环外部杀死无限循环中的pthread?

我创建了一个线程,并将其放入一个无限循环中。我在用valgrind检查代码时发现内存泄漏。这是我的密码: #include <pthread.h> #include <time.h> void thread_do(void){ while(1){} } int main(){ pthread_t th; pthread_create(&th, NULL, (void *)thread_do, NULL); sleep(2

C 有何利弊?;使用结构数组和指向结构的指针数组的缺点是什么?

我在试着决定我应该用哪一种 指向结构的指针的优点,我可以从头开始思考 如果不使用数组的所有元素,则会减少空间浪费 交换阵列元素时减少了无意中听到的内容 任何其他双方的赞成/反对意见?使用指针数组的缺点是: 指针(很可能)涉及使用动态内存分配,这意味着手动管理此动态内存。 动态内存分配略慢于堆栈分配。 此外,使用动态内存更容易发生使用错误 话虽如此,选择哪一个实际上取决于: 你的建筑有多大 编译时是否知道所需的结构数 您需要多久交换一次结构 一个可能的缺点是,对程序员来说,使用指针的开销更大

C 用单片机改变信号的相位值

我正在尝试使用可编程波形发生器AD9833和ATmega32-A微控制器(MCLK=8MHz时钟频率)生成正弦波。我正在使用USART通信,因此如果我在超级终端中更改频率或相位,则波形频率和相位必须更改。 我为此编写了如下所示的小代码 但是从上面的代码中,我生成了正弦波。如果我输入频率,那么波形频率也会发生变化,但我试图改变相位,这就是问题所在。如果我以90度进入相位,那么它将改变10度,而不是改变90度。我不知道为什么会这样,我犯了什么错误?我漏了什么吗?仅相位问题 提前谢谢 如果我想输入相位

C 为什么数组类型对象不可修改?

据说 术语“可修改左值”用于强调左值允许更改和检查指定对象。以下对象类型是左值,但不是可修改的左值: 数组类型 不完整的类型 常量限定类型 一种结构或联合类型,其中一个成员被限定为常量类型 由于这些左值不可修改,因此它们不能显示在赋值语句的左侧 为什么数组类型对象不可修改?这样写对不对 int i = 5, a[10] = {0}; a[i] = 1; ? 还有,什么是不完整类型?假设a是一个int数组,a[10]不是数组。它是一个int a={0}将是非法的。不完整类型是一种已声

C中的I/O错误

我花了几个小时试图找到我在大学里遇到的这个问题的答案。我尝试通过编写一个包含以下两行内容的文件来运行此功能: 你好 世界 而且它能很好地读取文件,所以我找不到答案。谢谢你的帮助 一名学生编写了下一个函数,用于读取文本文件并按原样打印 void ReadFile(FILE *fIn) { char nextLine[MAX_LINE_LENGTH]; while(!feof(fIn)) { fscanf(fIn,"%s",nextLine); printf("%s\n",nextLi

使字符串中的一个单词以大写字母显示,C语言编程

我想返回一个句子,其中一个单词以大写形式返回。 我有点知道我想怎么做,但我就是不能让它发挥作用。 这是我到目前为止的代码,但需要更多的工作 有什么想法我现在很迷茫吗 这就是问题的措辞 /* strhlt - Highlight substring Author - Your Name Limitations: The function will search for and highlight (capitalize) one instance

C语言中数据文件中的二维数组

这是我的密码。我试图从数据文件中读取二维数组,但我得到的是垃圾。怎么了 void read_array(int masyvas[][m]) { FILE *fp; if ( (fp=fopen("test.dat","wb+"))==NULL) { printf ("error \n"); system("pause"); exit (1); } printf("reading file\n");

C 如何在一个进程中接受SSL连接并在另一个进程中重用相同的SSL上下文

我花了相当长的时间研究如何解决这个问题,但还没有找到有效的解决办法 问题: 我正在使用OpenSSL库和linux。 我有一个从SSL客户端接受SSL连接的服务器进程P1。P1先执行tcp_accept(),然后执行SSL_accept(),并使用SSL_read/SSL_write()与客户端交换一些协议数据。到目前为止一切都很好。现在,根据设计,P1需要派生一个子进程C1,以便从此点开始为客户机提供服务。C1使用execve调用来重新映像自身并生成不同的二进制文件。C1仍然需要通过P1中使用

C 阅读行时忽略空格或换行符

我一直在读一行,直到按下enter/return(就像一个终端),但是当我忽略空格和回车时,我遇到了一些问题 以下是我阅读和检查空格/新行/注释的方式: char line[256]; while(printf("%s>", shell_name) && scanf(" %50[^\n]", line) != EOF){ if(isspace(*line) == 0 && line[0] != '#' && line[0] !

C 中断发送和接收字符串

任何人都可以显示一些示例代码或链接,帮助我解决这个问题。我想使用终端接收和发送字符串 到现在为止,我只得到了这个--> void usart\u init(void) { UBRRH=0x00; UBRRL=95; UCSRB=(1这个问题是相关的。从我所看到的,您现在想要使用中断驱动的方法 一般来说,您应该熟悉如何在C中处理字符串。本质上,您会将任何接收到的字符写入数组(即接收缓冲区)。因此 ReceivedByte = UDR 你会写这样的东西吗 _ReceiveBuffer[i++] =

C 检测strtol故障

如何检测strtol()是否未转换数字?我在下面这个简单的例子中测试了它,结果是0。现在一个明显的问题是,如何区分非转换和0的转换 long int li1; li1 = strtol("some string with no numbers",NULL,10); printf("li1: %ld\n",li1); **** li1: 0 stdio.h中的strtol声明如下: long int strtol(const char *nptr, char **endptr, int bas

C #define foo()do{}while(0)的目的

在浏览LinCAN驱动程序的源代码时,我发现了一些令我困惑的宏 #else /*CONFIG_PREEMPT*/ #define can_preempt_disable() do { } while (0) #define can_preempt_enable() do { } while (0) #endif /*CONFIG_PREEMPT*/ 我理解这项工作的用处 do { ...; if(condition) break; ... } while

C don';中的scanf字符串和printf;I don’我没有按预期工作

我正在为我的大学计算机科学课程做练习 我必须使用多个scanf和printf来获取关于一本书的数据,数据存储在一个结构中 请求数据的函数是 book_t addbook() { book_t book; printf("Insert ISBN: "); scanf("%s", book.isbn); printf("Insert author: "); scanf("%s", book.author); printf("Insert titl

C 如何跳过GDB中循环的多次迭代?

假设我有一个循环,将迭代100次,我想跳过50次迭代,但我想继续按next,从那里开始查看每一行 我不想在循环后设置断点,因为这样我将跳过所有迭代,而不仅仅是我想要的次数 在GDB中有这样做的方法吗?怎么做 另外,我不想从头到尾一直按next。这很耗时…例如,在C语言中,您可以通过“继续”跳过迭代。跳过mod 3等于0的数字的示例,因此数字3、9、12、15。。。将跳过 static void Main(string[] args) { for (int i = 1; i

C语言中的客户机/服务器程序

我是C套接字编程新手。我知道如何将TCP和UDP作为不同的程序编写。 但是只有一台服务器可以处理这两个客户端 有谁能告诉我如何编写一个同时处理TCP和UDP客户端的服务器吗?您不能使用一个服务器套接字侦听TCP和UDP客户端。但是,您可以创建2个服务器套接字(一个TCP服务器和一个UDP服务器)。请注意,两个都有一个服务器是没有意义的:UDP是无连接的,因此当您尝试在服务器套接字上执行accept时,会出现第一个问题(因为它是一个假设的混合版本,那么accept应该做什么?) 无论如何,我假设您

如何从文件生成字符数组? #包括 #包括 整数计数(文件*文件) { int c,计数=0; //文件*文件; //file=fopen(“test.txt”、“r”); 如果(文件){ 而((c=getc(文件))!=EOF){ 普查尔(c); ++计数;} fclose(文件); } 返回计数; } void make_arr(文件*文件,字符arr[]){ int c,n=0,count=0; char ch; //文件*文件; //file=fopen(“test.txt”、“r”); 如果(文件){ 而((c=getc(文件))!=EOF){ ch=(char)c; arr[n]=ch; ++n、 } fclose(文件); } } int main(){ 文件*文件; int n; //scanf(“%c”&文件名); file=fopen(“test.txt”、“r”); int count=count\u arr(文件); 字符arr[计数]; 制作arr(文件,arr); 对于(n=0;n

,这里有一个将文件读入缓冲区的小示例: #include <stdio.h> #include <stdlib.h> int count_arr(FILE *file) { int c,count=0; //FILE *file; //file = fopen("test.txt", "r"); if (file) { while ((c = getc(file)) != EOF){ putchar(c); ++count;}

C 为什么忽略SIGTRAP不适用于asm?

我试着忽略西格特拉普。我有以下概念验证代码: #include <signal.h> #include <stdlib.h> int main(){ signal(SIGTRAP, SIG_IGN); write(1, "A", 1); asm("int3"); write(1, "B", 1); return 0; } 为什么我的程序会在忽略SIGTRAP的情况下终止?根据被阻止/忽略的信号,当它被触发时,内核代码内部会自动解除

在C语言中将字符串解析为整数数组

所以现在我已经知道如何得到我想要的,我只是希望有人能让我知道一个更干净,更不荒谬的方式来实现同样的事情。我只是在学C。这是我的方法 int main() { // String of positive and negative integer values // Numbers are never more than 2 digits char TEMPS[256] = "1 -22 -8 14 5"; int N = 5; int ints[N];

C-将大量文件存储为单个资源

如果这个问题有一个显而易见的答案,请原谅我;我没有找到它,因为我不完全确定我在找什么。这很可能是我没有发现的重复问题;对不起 我有一个C可执行文件,它使用文本、音频、视频、图标和各种不同的文件类型。这些文件存储在本地;文件夹结构又大又深,需要与应用程序一起安装才能正确运行(我并不期望它被分发,我希望为方便起见打包自己的工作) 我个人认为,如果将文件库存储在应用程序可以访问的单个文件中,例如与/usr/bin/application一起或存储在最合适的位置,会更方便;在需要时由可执行文件访问 我搜

C 在未安装readline的计算机上使用readline?

我正在尝试解析我正在用c编写的程序的输入,我认为最简单的方法是使用GNU Readline。问题是,我的代码将用于的机器可能没有安装readline,我该如何解决这个问题?如果您在Linux或Mac中使用gcc,您可以静态链接程序中使用的所有库,只需在链接程序时添加-static标志,因此,该程序可以在任何地方运行。Ehm,为什么不按照@kaylum所说的那样安装它呢?它是为了一项必须独立于计算机上安装的内容工作的任务。理想情况下,您可以制作并准备好运行程序。是否安装readline?还是在re

如何在裸Linux内核上安装glibc?

出于某种原因,我正在尝试制作一个只需运行基本组件的最小Linux系统。我成功地在我的系统上安装了BusyBox,但在上面安装glibc时遇到了问题 我只是按照这个网站上的说明: 按照说明,glibc生成的所有库都放在“/lib”目录中。但是当我试图执行一个伪C程序时,如下所示 #include <stdio.h> int main { printf ("hello\n"); } 正如我所提到的,所有glibc库都在“/lib”目录中。未找到消息肯定不是由于缺少libc(您键入了哪

使用KEIL4时,lpc2148中断或IRQ不会执行

当定时器与MR0匹配时,在中断服务程序结束时运行中断服务程序。我不从服务程序返回主程序。为什么我的程序不能从服务例程返回 完整的代码请参见下面的答案您能详细说明吗?您必须展示您的努力,例如代码或其他东西,以使其更易于理解,以便人们更容易理解。您是否正在清除ISR中的中断请求标志?据我们所知,您的ISR可能是,而(1)。一个关于未指定代码的问题是无法回答的…不,请将其编辑到问题中!您需要将ISR定义为void timer\u ISR(void)\uu irq{…},否则,它只是一个普通函数,不会保

在C中以不同的精度从文件中读取浮点值

如果我有一个包含浮点数行的文件,如下所示: 4.5 -3.2 3.3 5.62 0.56 3.231 5.632 -4.56 2 5.8212 4 6.7 如何逐行读取并拆分数字以保存在数组中(它们由一个制表器分隔) 多谢各位 编辑: 我做了以下工作,它的工作,谢谢大家的帮助 #include <stdio.h> #include <stdlib.h> int main(){ float array[2][6]; FILE *f; f=fopen

使用gdb查找memcpy错误

以下代码中的错误是memcpy(t[j],m[j],sizeof(int)*DIM*DIM)应该是memcpy(t[j],m[j],sizeof(int)*DIM): 在我该怎么做之后?您不能总是通过这种方式找到真正的错误,但您可以找到分段冲突发生的位置 您需要使用调试信息编译程序,最好不要进行优化,即使用-ggdb-O0编译标志。如果冲突发生在库函数中,如示例中所示,请使用gdb命令up向上移动调用堆栈,直到到达代码。然后,您应该会看到程序中有问题的一行 确保gdb可以找到您的来源。通常,当当

使用strcpy为结构赋值会返回段错误

我有下面的代码,我试图给结构名赋值,但它返回给我段核心错误。为什么呢 struct group { char *name; struct user *users; struct xct *xcts; struct group *next; }; int add_group(Group **group_list_ptr, const char *group_name) { Group *newGroup = malloc(sizeof(Group));

用fork()进行C系统编程

好吧,我到底做错了什么?我在Ubuntu上做这件事,我希望它接受系统命令“ls”和一个参数,比如“-a”,然后让子代执行它,然后父代打印出一些东西。我不明白为什么我总是两次得到“家长”的回复。有什么想法吗 #include <stdio.h> #include <sys/types.h> #include <time.h> #include <stdlib.h> #include <sys/time.h> #include <

如果strcpy和strcat命令没有重复,则无法从函数中获取字符串并显示

我试图从一个函数中传递一个字符串,复制它,与其他字符串连接并显示在主函数中。但是我需要复制strcpy和strcat命令来获得我需要的答案 我的警告: test1.c:15:1:警告:函数返回局部变量[-Wreturn local addr]的地址 #include <stdio.h> #include <string.h> #include <ctype.h> char *return_string(int number) { char out1[

强制GCC使用单词访问结构

在ARM处理器(HT32F1655)上,寄存器的特定部分需要字访问。从用户手册: 请注意,AHB总线中的所有外围寄存器仅支持字访问 但gcc正在压缩结构上生成一些ldrb(加载字节)和strb(存储字节)指令。结构看起来像这样: typedef union { struct { uint32_t CKOUTSRC : 3; //!< CKOUT Clock Source Selection uint32_t : 5

C 如何将浮点数舍入为两个小数点?

我写了一个程序,在这个程序中,计算机向用户请求一个浮点数。例如,如果我的输入为0.41,则printf中的输出为0.40999999。如何解决此错误?这很简单。使用: printf("%.2f", 0.409999999); 这将打印0.41大多数浮点数据类型本质上是不精确的。他们试图将实数(无限精度)存储在有限精度位向量中。因此,在您的平台上,0.41的最接近表示形式可能是0.40999999 您应该仔细阅读IEEE754浮点表示,了解您遇到的问题。 %f(作为浮点打印) %4f(以浮点打印

C For循环迭代次数为预期迭代次数的两倍

我正在编写一个C程序,它会提示用户输入文件名,输入时会显示前20行,然后等待用户输入。所以,一切都很好,只是它显示了40行而不是20行,所以我把行数减少到1行,它显示了2行。我甚至尝试了while循环而不是for循环,但结果仍然一样 #include <stdio.h> int main (void) { FILE *in; char file[81], buffer[81]; int flag = 1, c, i; printf("File: "

C 传递参数1将从指针生成整数,而不产生强制转换警告

我正在使用代码块和学习C。我创建了这个简单的脚本作为学习函数的起点。我不理解我所犯的错误,因为我眼中的一切都是一致的 代码: 编辑: 我改变了建议: SetPerson(char *a, int b); 现在我犯了这些错误: ||=== Build: Debug in remove (compiler: GNU GCC Compiler) ===| C:\Users\e\Desktop\c programs\remove\main.c||In function 'main':| C:\User

为什么我的ADPCM解码器似乎在振荡?

我正在为嵌入式处理器(ARM Cortex-M4)编写代码 此代码的目的是解码Intel/DVI格式(也称为IMA格式)的4位ADPCM。我使用Python的audioop模块对一个方波的ADPCM样本进行了编码。然后,我使用相同的audioop模块成功解码了该样本,它与输入非常匹配 但是,我无法在嵌入式处理器上正确解码输入数据。表示输出的valpred值似乎在较大的正值和较大的负值之间跑掉和振荡。这似乎是由符号值的行为驱动的。我遇到的问题是,这段代码实际上是audioop的C实现代码的复写,删

C regex验证文件夹下的文件名

我不熟悉C中的正则表达式,我正在尝试使用regex.hlibrary查找给定文件名是否位于使用regex的文件夹下。这就是我尝试过的: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <regex.h> int checkregex(char regex_str[100], char test[100]) { regex_t regex; pr

C在缓冲区中创建额外字节

今天我一直在胡闹C,当我注释掉代码中的第三个缓冲区时,我不理解输出的区别: #include <unistd.h> #include <string.h> #include <stdio.h> void main() { unsigned char letters[10]; memset(letters, 0x00, 10); memset(letters, 0x41, 10); printf(letters);

C 贪心算法返回的数量对于较小的值来说太大,但对于较大的值来说却不是

我正在写一个贪婪的算法(这已经让我很头疼了),它可以输出最小数量的硬币,可以用于一些货币价值,我最终得到了我满意的代码,或者我是这么想的。当输入值.41时,我返回了4枚硬币,这是正确的-但是,输入.01返回2枚硬币,我不知道为什么 // declare variable change_owed, num_coins, and input globally float change_owed = 0; float dollars; int cents; int num_coins; int ma

C Pow不适用于两个两位数的数字

我制作了一个代码,从标准输入和输出(到标准输出)a到B的幂读取两个长整数(a和B) 它适用于1^2个大数字,3^3等等 但不是13^16 我试着用长整数来解决它,它给了我一个不同的值,但不是正确的值 #include <stdio.h> #include <math.h> int main() { int x, n; long int ans; scanf("%d \n %d",&x, &n); ans = pow(x

在exec函数中使用来自用户的字符串

我想对用户发送的单词使用exec(),目前我尝试过并导致了一个“无效参数”错误,我的想法可行吗?如果可行,如何实现 当前代码: char word[30]; recv(new_sock, &word, sizeof(word), 0); char command[1024]; sprintf(command,"%s %s","grep -w -i",word); char *exp[] = {command, NULL}; execvp(exp[0], exp); 看起来你有两个问题。

使用visualstudio代码在ubuntu中编写C程序

我写的代码是: #include<stdio.h> int main() { int i,m,maths=0,english=0,e,science=0,s,all=0; for(i=1;i<=5;i++) { printf("enter the marks of english:\n"); scanf("%d",&e); printf("enter the marks of mat

C read()或write()系统调用是否可以在被EINTR信号中断后停止的位置继续?

我想知道如果它收到一个中断信号,这个代码怎么能在它停止的地方继续。在这种情况下,read()系统调用必须重新开始,它不是让它从头开始吗?同样的事情对于write()系统调用也是有效的。您能解释一下这些系统调用在这些情况下的行为吗? 如果read()在读取任何数据之前被信号中断,它应返回-1,并将errno设置为EINTR 如果read()在成功读取某些数据后被信号中断,则应返回读取的字节数 在任何一种情况下,对read()的下一次调用都将继续读取在调用中断之前中断的位置 如果read()未检索到

  1    2   3   4   5   6  ... 下一页 最后一页 共 6708 页