标签: C
strlenstring-length
我已经读到使用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的每次
在cons函数中,变量ptr的类型为cons\u object*。但在返回值中,它被转换为对象的类型*
我想知道这是怎么可能的,因为cons\u object和object是不同的结构
这样做有什么问题吗
任何想法 这很好,是在C中实现“面向对象”的一种相当常见的技术。因为structs的内存布局在C中定义得很好,只要两个对象共享相同的布局,就可以在它们之间安全地强制转换指针。也就是说,类型成员在对象结构中的偏移量与在cons_对象结构中的偏移量相同
在本例中,类型成员告诉API该对象是cons
我知道如何使用kill(pid\utpid,intsig)函数向C中的子进程发送信号。向线程发送信号怎么样?可能吗?。如果是这样,如何捕捉“子”线程上的信号。例如,如果主线程向我发送终止信号,我如何在另一个线程中捕获它 我不确定这是否可行,因为这取决于平台和实现,我强烈建议您不要使用信号在线程之间进行通信。有时只有一个特定线程接收信号,有时所有线程都接收信号
存在更好的线程通信机制,如队列、信号量和锁。信号没有线程亲和力。它们是完全异步处理的。使用signal(2)或sigaction(2)指定
我有一个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语言编程,我们重写了计时器中断,在我们编写的计时器中断之后,我们必须处理4个进程,但我们需要获取进程的上下文,如指令指针、数据段等。我们如何从C语言中获取这些信息?如果不是,我们是否也需要在C代码中使用ASM?谢谢:D
我正在使用Windows XP 32位的virtual box,并且使用DOS 16位虚拟机,您可能需要使用汇编代码来执行上下文保存/还原,除非您已经实现了诸如getcontext之类的库例程。是,你至少需要一点汇编语言。典型的起点是pusha。这样可
我必须编写一个程序,可以计算2power2010的幂,并找到数字的和。例如:
if `2 power 12 => gives 4096 . So 4+0+9+6 = 19 .
现在我需要为2 power 2010找到相同的版本。
请帮助我理解。您必须使用提供无限整数长度类型的库(请参阅),或者实现不需要这些类型的解决方案(例如,使用数字阵列并自行在阵列上实现功率计算,在您的情况下,这可以像循环中的加法一样简单)。既然这是家庭作业,可能是后者。知道2^32,你会如何用笔和纸计算2^33
我创建了一个线程,并将其放入一个无限循环中。我在用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
我在试着决定我应该用哪一种
指向结构的指针的优点,我可以从头开始思考
如果不使用数组的所有元素,则会减少空间浪费
交换阵列元素时减少了无意中听到的内容
任何其他双方的赞成/反对意见?使用指针数组的缺点是:
指针(很可能)涉及使用动态内存分配,这意味着手动管理此动态内存。
动态内存分配略慢于堆栈分配。
此外,使用动态内存更容易发生使用错误
话虽如此,选择哪一个实际上取决于:
你的建筑有多大
编译时是否知道所需的结构数
您需要多久交换一次结构
一个可能的缺点是,对程序员来说,使用指针的开销更大
我正在尝试使用可编程波形发生器AD9833和ATmega32-A微控制器(MCLK=8MHz时钟频率)生成正弦波。我正在使用USART通信,因此如果我在超级终端中更改频率或相位,则波形频率和相位必须更改。
我为此编写了如下所示的小代码
但是从上面的代码中,我生成了正弦波。如果我输入频率,那么波形频率也会发生变化,但我试图改变相位,这就是问题所在。如果我以90度进入相位,那么它将改变10度,而不是改变90度。我不知道为什么会这样,我犯了什么错误?我漏了什么吗?仅相位问题
提前谢谢
如果我想输入相位
我有一个如下所示的结构:
typedef struct {
player *lastmover;
player *previous;
} lastmove;
typedef struct {
int moves;
char *name;
} player;
我尝试这样分配内存,以便:
lastmove lmv;
lmv.lastmover=malloc(sizeof(player *));
lmv.previous=malloc(sizeof(playe
我正在基于OpenMP创建一个基本素数检查器,但使用OpenMP
int isPrime(int value)
{
omp_set_num_threads(4);
#pragma omp parallel for
for( int j = 2; j * j <= value; j++)
{
if ( value % j == 0) return 0;
}
return value;
}
intisprime(int值)
{
o
据说
术语“可修改左值”用于强调左值允许更改和检查指定对象。以下对象类型是左值,但不是可修改的左值:
数组类型
不完整的类型
常量限定类型
一种结构或联合类型,其中一个成员被限定为常量类型
由于这些左值不可修改,因此它们不能显示在赋值语句的左侧
为什么数组类型对象不可修改?这样写对不对
int i = 5, a[10] = {0};
a[i] = 1;
?
还有,什么是不完整类型?假设a是一个int数组,a[10]不是数组。它是一个int
a={0}将是非法的。不完整类型是一种已声
我花了几个小时试图找到我在大学里遇到的这个问题的答案。我尝试通过编写一个包含以下两行内容的文件来运行此功能:
你好
世界
而且它能很好地读取文件,所以我找不到答案。谢谢你的帮助
一名学生编写了下一个函数,用于读取文本文件并按原样打印
void ReadFile(FILE *fIn)
{
char nextLine[MAX_LINE_LENGTH];
while(!feof(fIn))
{
fscanf(fIn,"%s",nextLine);
printf("%s\n",nextLi
我想返回一个句子,其中一个单词以大写形式返回。
我有点知道我想怎么做,但我就是不能让它发挥作用。
这是我到目前为止的代码,但需要更多的工作
有什么想法我现在很迷茫吗
这就是问题的措辞
/*
strhlt - Highlight substring
Author - Your Name
Limitations: The function will search for and highlight (capitalize) one instance
标签: C
multidimensional-array
这是我的密码。我试图从数据文件中读取二维数组,但我得到的是垃圾。怎么了
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");
我花了相当长的时间研究如何解决这个问题,但还没有找到有效的解决办法
问题:
我正在使用OpenSSL库和linux。
我有一个从SSL客户端接受SSL连接的服务器进程P1。P1先执行tcp_accept(),然后执行SSL_accept(),并使用SSL_read/SSL_write()与客户端交换一些协议数据。到目前为止一切都很好。现在,根据设计,P1需要派生一个子进程C1,以便从此点开始为客户机提供服务。C1使用execve调用来重新映像自身并生成不同的二进制文件。C1仍然需要通过P1中使用
标签: C
newlinewhitespacescanf
我一直在读一行,直到按下enter/return(就像一个终端),但是当我忽略空格和回车时,我遇到了一些问题
以下是我阅读和检查空格/新行/注释的方式:
char line[256];
while(printf("%s>", shell_name) && scanf(" %50[^\n]", line) != EOF){
if(isspace(*line) == 0 && line[0] != '#' && line[0] !
任何人都可以显示一些示例代码或链接,帮助我解决这个问题。我想使用终端接收和发送字符串
到现在为止,我只得到了这个-->
void usart\u init(void)
{
UBRRH=0x00;
UBRRL=95;
UCSRB=(1这个问题是相关的。从我所看到的,您现在想要使用中断驱动的方法
一般来说,您应该熟悉如何在C中处理字符串。本质上,您会将任何接收到的字符写入数组(即接收缓冲区)。因此
ReceivedByte = UDR
你会写这样的东西吗
_ReceiveBuffer[i++] =
如何检测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
在浏览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
我正在为我的大学计算机科学课程做练习
我必须使用多个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
假设我有一个循环,将迭代100次,我想跳过50次迭代,但我想继续按next,从那里开始查看每一行
我不想在循环后设置断点,因为这样我将跳过所有迭代,而不仅仅是我想要的次数
在GDB中有这样做的方法吗?怎么做
另外,我不想从头到尾一直按next。这很耗时…例如,在C语言中,您可以通过“继续”跳过迭代。跳过mod 3等于0的数字的示例,因此数字3、9、12、15。。。将跳过
static void Main(string[] args)
{
for (int i = 1; i
我是C套接字编程新手。我知道如何将TCP和UDP作为不同的程序编写。
但是只有一台服务器可以处理这两个客户端
有谁能告诉我如何编写一个同时处理TCP和UDP客户端的服务器吗?您不能使用一个服务器套接字侦听TCP和UDP客户端。但是,您可以创建2个服务器套接字(一个TCP服务器和一个UDP服务器)。请注意,两个都有一个服务器是没有意义的:UDP是无连接的,因此当您尝试在服务器套接字上执行accept时,会出现第一个问题(因为它是一个假设的混合版本,那么accept应该做什么?)
无论如何,我假设您
,这里有一个将文件读入缓冲区的小示例:
#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;}
我试着忽略西格特拉普。我有以下概念验证代码:
#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的情况下终止?根据被阻止/忽略的信号,当它被触发时,内核代码内部会自动解除
如何将树转换为其镜像树。例如
1 1
/ \ / \
2 3 to 3 2
/ \
4 4
执行后序遍历
void mirror(struct node* node)
{
if (node!=NULL)
{
struct node* temp
所以现在我已经知道如何得到我想要的,我只是希望有人能让我知道一个更干净,更不荒谬的方式来实现同样的事情。我只是在学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可执行文件,它使用文本、音频、视频、图标和各种不同的文件类型。这些文件存储在本地;文件夹结构又大又深,需要与应用程序一起安装才能正确运行(我并不期望它被分发,我希望为方便起见打包自己的工作)
我个人认为,如果将文件库存储在应用程序可以访问的单个文件中,例如与/usr/bin/application一起或存储在最合适的位置,会更方便;在需要时由可执行文件访问
我搜
我正在尝试解析我正在用c编写的程序的输入,我认为最简单的方法是使用GNU Readline。问题是,我的代码将用于的机器可能没有安装readline,我该如何解决这个问题?如果您在Linux或Mac中使用gcc,您可以静态链接程序中使用的所有库,只需在链接程序时添加-static标志,因此,该程序可以在任何地方运行。Ehm,为什么不按照@kaylum所说的那样安装它呢?它是为了一项必须独立于计算机上安装的内容工作的任务。理想情况下,您可以制作并准备好运行程序。是否安装readline?还是在re
出于某种原因,我正在尝试制作一个只需运行基本组件的最小Linux系统。我成功地在我的系统上安装了BusyBox,但在上面安装glibc时遇到了问题
我只是按照这个网站上的说明:
按照说明,glibc生成的所有库都放在“/lib”目录中。但是当我试图执行一个伪C程序时,如下所示
#include <stdio.h>
int main { printf ("hello\n"); }
正如我所提到的,所有glibc库都在“/lib”目录中。未找到消息肯定不是由于缺少libc(您键入了哪
Yacc来源如下:
element: IDENTIFIER { $$ = gst_element_factory_make ($1, NULL);
if ($$ == NULL) {
ADD_MISSING_ELEMENT (graph, $1);
SET_ERROR (graph->error, GST
当定时器与MR0匹配时,在中断服务程序结束时运行中断服务程序。我不从服务程序返回主程序。为什么我的程序不能从服务例程返回
完整的代码请参见下面的答案您能详细说明吗?您必须展示您的努力,例如代码或其他东西,以使其更易于理解,以便人们更容易理解。您是否正在清除ISR中的中断请求标志?据我们所知,您的ISR可能是,而(1)。一个关于未指定代码的问题是无法回答的…不,请将其编辑到问题中!您需要将ISR定义为void timer\u ISR(void)\uu irq{…},否则,它只是一个普通函数,不会保
如果我有一个包含浮点数行的文件,如下所示:
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
以下代码中的错误是memcpy(t[j],m[j],sizeof(int)*DIM*DIM)应该是memcpy(t[j],m[j],sizeof(int)*DIM):
在我该怎么做之后?您不能总是通过这种方式找到真正的错误,但您可以找到分段冲突发生的位置
您需要使用调试信息编译程序,最好不要进行优化,即使用-ggdb-O0编译标志。如果冲突发生在库函数中,如示例中所示,请使用gdb命令up向上移动调用堆栈,直到到达代码。然后,您应该会看到程序中有问题的一行
确保gdb可以找到您的来源。通常,当当
我有下面的代码,我试图给结构名赋值,但它返回给我段核心错误。为什么呢
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));
好吧,我到底做错了什么?我在Ubuntu上做这件事,我希望它接受系统命令“ls”和一个参数,比如“-a”,然后让子代执行它,然后父代打印出一些东西。我不明白为什么我总是两次得到“家长”的回复。有什么想法吗
#include <stdio.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
#include <sys/time.h>
#include <
我试图从一个函数中传递一个字符串,复制它,与其他字符串连接并显示在主函数中。但是我需要复制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[
在ARM处理器(HT32F1655)上,寄存器的特定部分需要字访问。从用户手册:
请注意,AHB总线中的所有外围寄存器仅支持字访问
但gcc正在压缩结构上生成一些ldrb(加载字节)和strb(存储字节)指令。结构看起来像这样:
typedef union {
struct {
uint32_t CKOUTSRC : 3; //!< CKOUT Clock Source Selection
uint32_t : 5
我写了一个程序,在这个程序中,计算机向用户请求一个浮点数。例如,如果我的输入为0.41,则printf中的输出为0.40999999。如何解决此错误?这很简单。使用:
printf("%.2f", 0.409999999);
这将打印0.41大多数浮点数据类型本质上是不精确的。他们试图将实数(无限精度)存储在有限精度位向量中。因此,在您的平台上,0.41的最接近表示形式可能是0.40999999
您应该仔细阅读IEEE754浮点表示,了解您遇到的问题。
%f(作为浮点打印)
%4f(以浮点打印
我尝试了下面的代码foo1.c
#include<stdio.h>
void f(void);
int x = 38;
int y = 39;
int main() {
f();
printf("x = %d\n", x);
printf("y = %d\n", y);
return 0;
}
输出:
$ gcc -o myprog foo1.c foo2.c
$ ./myprog
x = 0
y = 1078263808
这段代码的输出很奇怪,有人能解释一下它是怎么来的吗 在
我正在编写一个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。我创建了这个简单的脚本作为学习函数的起点。我不理解我所犯的错误,因为我眼中的一切都是一致的
代码:
编辑:
我改变了建议:
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
我正在为嵌入式处理器(ARM Cortex-M4)编写代码
此代码的目的是解码Intel/DVI格式(也称为IMA格式)的4位ADPCM。我使用Python的audioop模块对一个方波的ADPCM样本进行了编码。然后,我使用相同的audioop模块成功解码了该样本,它与输入非常匹配
但是,我无法在嵌入式处理器上正确解码输入数据。表示输出的valpred值似乎在较大的正值和较大的负值之间跑掉和振荡。这似乎是由符号值的行为驱动的。我遇到的问题是,这段代码实际上是audioop的C实现代码的复写,删
我不熟悉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,当我注释掉代码中的第三个缓冲区时,我不理解输出的区别:
#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);
我正在写一个贪婪的算法(这已经让我很头疼了),它可以输出最小数量的硬币,可以用于一些货币价值,我最终得到了我满意的代码,或者我是这么想的。当输入值.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
我制作了一个代码,从标准输入和输出(到标准输出)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(),目前我尝试过并导致了一个“无效参数”错误,我的想法可行吗?如果可行,如何实现
当前代码:
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);
看起来你有两个问题。
我写的代码是:
#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
Unix
posixsystem-callssystems-programming
我想知道如果它收到一个中断信号,这个代码怎么能在它停止的地方继续。在这种情况下,read()系统调用必须重新开始,它不是让它从头开始吗?同样的事情对于write()系统调用也是有效的。您能解释一下这些系统调用在这些情况下的行为吗?
如果read()在读取任何数据之前被信号中断,它应返回-1,并将errno设置为EINTR
如果read()在成功读取某些数据后被信号中断,则应返回读取的字节数
在任何一种情况下,对read()的下一次调用都将继续读取在调用中断之前中断的位置
如果read()未检索到
1 2 3 4 5 6 ...
下一页 最后一页 共 6708 页