标签: ansi-c

将收到的可变数量的参数传递给另一个函数

在你说它重复之前,我已经读过:如何将可变数量的参数从一个函数传递到另一个函数?

我有这样的功能:

void tlog_function(t_log* logger, const char* message_template, ...) {
    pthread_mutex_lock(&loggerLock);
    log_function(logger, message_template, ...); // What I want to do..
    pthread_mutex_unlock(&loggerLock);
}
Run Code Online (Sandbox Code Playgroud)

而另一个这样的功能,不是我的,我在第三方库中使用它:

void log_function(t_log* logger, const char* message_template, ...);
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我想要做的只是在这个函数中添加一个互斥锁以使其具有线程安全性,我知道我可以使用va_list但在这种情况下我无法更改第二个函数的代码,因为它在库中我只有.h文件.

那么,有没有办法实现这一目标?

c arguments function ansi-c

2
推荐指数
1
解决办法
79
查看次数

解析CSV文本行时出错

我无法在C中解析CSV文件.我需要使用该文件中的数据来提交结构.这是我结构的相关部分:

typedef struct Info {
    /* Some strings, integers, etc. */
    char correct; /* This is the value I can't set */
    short int status;
} t_info;
Run Code Online (Sandbox Code Playgroud)

我文件中的一行看起来像这个xxxxxx; xxxxxxx; xxxxxxx; D; 254(D是我的问题,见下文).

    char line[1024]; /* Buffer */
    t_info info;

    fgets(line, sizeof(line), fp);

    strcpy(info.xxxxxx, getLine(line, 1)); /* Works */
    strcpy(info.xxxxxx, getLine(line, 2)); /* Works */
    strcpy(info.xxxxxx, getLine(line, 3)); /* Works */
    strcpy(info.correct, getLine(line, 4)); /* Crashs! */
Run Code Online (Sandbox Code Playgroud)

getLine()函数取自这篇文章:

const char *getLine(char *line, int num)
{ …
Run Code Online (Sandbox Code Playgroud)

c csv ansi-c

2
推荐指数
1
解决办法
205
查看次数

在C中的某个字符后从字符串中删除文本

我正在从文件中读取行,这些行看起来像这样:

89f81a03eb30a03c8708dde38cf:000391716
Run Code Online (Sandbox Code Playgroud)

问题是:我想删除:(包括:)之后的所有内容.我尝试了我能在网上找到的所有东西,但它们似乎都在使用,const char而且这些线条都是char指针.

c string strip char ansi-c

2
推荐指数
1
解决办法
4477
查看次数

有没有办法将未知类型的数组作为参数传递给 C 中的函数?

我一直在努力提高我的 C 技能和知识。今天我尝试创建一个接受任何类型数组的函数,但我还没有找到成功的方法,我正在使用 ANSI C 并且我尝试过将其作为 void 指针传递,但是当我尝试使用参数操作内存时,编译器会抱怨。有什么办法可以实现吗?我在想可能可以通过预处理器指令来完成,但我不确定。

PS:我的目标不是用数据填充数组,这只是一个函数,而是理解和学习如何在我不知道其类型的情况下传递数据,或者允许我的函数处理多种类型的数据数据。

这是编译过程的输出:

array_test.c:在函数“array_fill”中:

array_test.c:34:13:警告:算术中使用“void *”类型的指针 [-Wpointer-arith]

*(数组+ i)=数据;

^

array_test.c:34:5:警告:取消引用“void *”指针

*(数组+ i)=数据;

^~~~~~~~~~~~

array_test.c:34:5:错误:void 表达式的使用无效

*(数组+ i)=数据;

^

这是我的代码:

#include <stdio.h>

#define array_length(array) (sizeof(array)/sizeof(array[0]))

#define ARBITRARY_SIZE 10    

typedef enum
{
  false,
  true
} bool;

int array_fill(void*, int, int);

int main(int argc, char* argv[])
{
  int array[ARBITRARY_SIZE];
  int i;
 
  array_fill(array, array_length(array), 0);

  for(i = 0; i < array_length(array); i++)
  {
    printf("array[%d]: %d\n", i, *(array + i));
  }

  return 0;
} 

int array_fill(void* …
Run Code Online (Sandbox Code Playgroud)

c ansi-c

2
推荐指数
1
解决办法
3532
查看次数

pow(1,0)返回0?

为什么这样:

printf("%d\n", pow(1,0)); /* outputs 0 */
Run Code Online (Sandbox Code Playgroud)

回来了0?我期待它回归1.

c printf pow ansi-c

1
推荐指数
1
解决办法
1200
查看次数

ANSI C 中的一维数组中是否可以有多个字符串?

我知道如何使用二维数组制作字符串数组,但我可以这样做:

char array[];
array[1]="bob";
array[2]="cat";
Run Code Online (Sandbox Code Playgroud)

c arrays string ansi-c

1
推荐指数
1
解决办法
4241
查看次数

什么在FLASH中占用更多空间?静态变量或全局变量

正如标题所说,在FLASH中占用更多空间(例如在STM32μC中)?声明一个全局变量或在函数内声明一个静态变量?或者他们是否占用相同的空间?根据我的理解,这两个变量在整个程序运行时都可用.只是他们的范围不同.

c stm32 ansi-c

1
推荐指数
1
解决办法
682
查看次数

Cmake 传递参数

我有一个程序可以根据文件的签名来识别文件。效果很好。但我是 C 语言新手,现在正在尝试让一个名为 CLion 的 IDE 运行。但是,我不知道如何向 cmake 添加命令参数 - 这样当我运行 main 并想要传递 gifFile 或 pdfFile 来识别时我可以这样做。这是到目前为止我的 cmake 代码。

cmake_minimum_required(VERSION 3.8)
project(Assignment6)

set(CMAKE_C_STANDARD 99)

set(SOURCE_FILES file_recognizer.c)
add_executable(Assignment6 ${SOURCE_FILES})
Run Code Online (Sandbox Code Playgroud)

在命令行中这会是这样的

gcc file_recognizer.c -o Assignment6
Run Code Online (Sandbox Code Playgroud)

然后你说

./Assignment6 gifFile.gif
Run Code Online (Sandbox Code Playgroud)

如何让 cmake 接受末尾的参数“gifFile.gif”?

下面是我的主要功能,如果需要的话可以参考

int main(int argc, char const *argv[]) {
    FILE *yourFile;
    unsigned char *fileBytes, *fileType;
    long fileLength;

    fileLength = 10;
    if(argc != 2 || (yourFile = fopen(argv[1], "rb")) == NULL) {
        printf("Invalid Input\n");
        exit(-1);
    }

    fileBytes = readFile(yourFile, fileLength, fileBytes);
    determineFileType(fileBytes, fileType); …
Run Code Online (Sandbox Code Playgroud)

cmake clion ansi-c

1
推荐指数
1
解决办法
6263
查看次数

为什么argv的第一个参数是1而不是0

我有一些参数可以让程序正常工作。该参数应该是 MAX_NUM, x, y。

当捕获 char 输入列表的参数时,我当前使用参数 1 而不是 0 获取 MAX_NUM。

前任:

int main (int argc, char *argv[]) {
    int MAX_NUM = atoi(argv[0]);
    int x = atoi(argv[1]);
    int t = atoi(argv[2]);
    printf("MAX_NUM %d\n", atoi(argv[0]));
....

Run Code Online (Sandbox Code Playgroud)

打印argv[1]我正确地得到了 MAX_NUM,当打印第一个参数时得到 0。

为什么 C 将 char 输入列表数组初始化为 1 而不是 0 或程序名称?

c ansi-c

1
推荐指数
1
解决办法
1933
查看次数

表达式必须是指向完整对象类型的指针,为什么在这种情况下会出现此错误?

这是我的情况的简化:

头文件.h

#DEFINE NUMBER 3
extern char reserved[][];
Run Code Online (Sandbox Code Playgroud)

定义器

char reserved[NUMBER][4] = {"WOW","LOL","K"}
Run Code Online (Sandbox Code Playgroud)

符号.c

#include "header.h"
void theFunctionWithTheError{
    
       if (reserved[1] == "I love stackoverflow"){ /**THE LINE OF THE ERROR*/
       return;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 sign.c 中,我收到错误Expression must be a pointer to a complete object type for the wordreserved

你建议我做什么?

c ansi-c

1
推荐指数
1
解决办法
63
查看次数

标签 统计

ansi-c ×10

c ×9

string ×2

arguments ×1

arrays ×1

char ×1

clion ×1

cmake ×1

csv ×1

function ×1

pow ×1

printf ×1

stm32 ×1

strip ×1