我做的这个函数能正确地将一个字符串追加到另一个字符串吗?
我昨晚在凌晨3点进行编码,我今天醒来,在源文件中找到它:(诅咒单词已编辑) void append_this_stuff(char *stuff_to_append_to[], char **stuff_to_append, int position) { char the_actual_stuff[] = *(stuff_to_append_to); char *screw_me = *(stuff_to_append); int someNumber = strlen(screw_me); int j = 0; for (int i = position; i
4 2024-04-10
编程技术问答社区
仍然能够访问一个已经被释放的结构
所以,我有一个结构: tyepdef struct node { struct node *next; double value; } NodeT, *NodeTP; 我有三个功能: int deleteNode(NodeTP p) { free(p); p = NULL; return 1; } int deleteOne(NodeTP list) { if (list->next != NULL) deleteOne(list->next); else deleteNode(list); return 1; } int print(NodeT list) {
10 2024-04-10
编程技术问答社区
如何在没有setenv()的情况下在ISO c99标准C中设置环境变量?
我不能从stdlib.h中使用stdlib.h对于C99标准编译器,因为它不可用.在C99中是否还有其他功能可以设置环境变量? 解决方案 getenv因此是C99中包含的C90标准的一部分,但setenv仅符合IEEE标准,因此不得不包含在严格的标准C99中.此外,相应的IEEE是从2001年开始的. 这意味着在C99中没有任何标准方法,您必须使用特定于平台的代码来设置Env. 在freebsd上 man page : getEnv()函数符合ISO/IEC 9899:1990(ISO C90''). The setenv(), putenv() and unsetenv() functions conforms to IEEE Std 1003.1-2001 ( posix.1''). setenv,putenv等等. 如果您使用的是Windows,请参见其他问题谈论
4 2024-04-10
编程技术问答社区
如何将一个变量参数Functioncall作为宏定义?
想象,我有一个调试源文件, 这样: #if _OWN_DEBUG_LEVEL != 0 void DebugLogMsg (DebugStruct_t *DebugStruct, size_t sizeID, char const *szFormat, ...); #else #define DebugLogMsg(_Expression1, _Expression2, _Expression3) ((void)0) #endif 在这种情况下,我并不真正在乎该功能的其他论点,但是这种情况呢? #if _OWN_DEBUG_LEVEL > 0 #undef DebugLogMsg1 #define DebugLogMsg1(_Expression1, _Expression2, _Expression3) \ DebugLogMsg(_Expression1, _Expression2, _Expressio
10 2024-04-10
编程技术问答社区
C语言中的名称空间
我有以下代码: typedef struct Y {int X;} X; enum E {X}; 生成错误: 错误:'x'重新定义为不同的符号 我知道,C已隐式定义了结构,联合和枚举标签以及其成员的命名空间.因此,我不确定E::X为什么与Typedef结构TAG X碰撞? c? 中的名称空间到底是什么 解决方案 C没有enum成员的单独名称空间.当您编写enum {X}时,会创建一个全局常数X(可以与其他全局名称(例如typedef'd标签)发生冲突). 其他解决方案 因为类型X在 global 名称空间中声明,然后包含enum E,而enum E又包含X的重新分配.因此,发生这种情况是因为它们不在同一级别上 - 一个"命名空间"包含另一个.
8 2024-04-10
编程技术问答社区
将数字作为(x, y)坐标从文件中存储在一个特定点上
我有一个实例文件我需要存储 num_pt 和所有相应的坐标都以2D阵列系统的形式( 个人选择,因此我可以轻松地访问 ).我能够检索 num_pt ,但我坚持读取连续的绳索. 这是我所做的 /* Assignment 2 */ #include #include #include #include #include #define MAXS 256 int main(int argc, char *argv[]) { int num_pt; int inputfile = 0, outputfile = 0, i; for (i = 1; i
2 2024-04-10
编程技术问答社区
写入不同文件名的独立文件
这是我要实现的目标: 假设用户输入为: 生成随机实例... 输入电路板大小max_x max_y:100 200 输入num_pt的点数:10 输入要生成的随机实例的数量:7 您的程序将在总共7个实例中生成,并写入7个实例 单独的文件" instance10_j.txt",j = 1、2、3,...每个 实例具有矩形区域[0; 100] x [0; 200],有10个 点.一个点的坐标是均匀生成的 在矩形区域内.并且您的程序确保没有 每个实例中的重复点.如果您不可能 程序生成这些文件,打印出什么错误并退出. 所有这些文件都保存在执行的当前目录中 命令,您的程序打印到屏幕: instance10_1.txt生成 instance10_2.txt生成 instance10_3.txt生成 实例10_4.txt生成 instance10_5.txt生成 instance10_6.txt生成 instance10_7.
6 2024-04-10
编程技术问答社区
为什么在c99或c90模式下支持_Generic关键字?
我编写了一个简单的C程序,以测试 _generic 关键字的可用性. int main() { int _Generic; } 我使用 gcc-5.3.1 和 clang-3.8.0 编译器在ubuntu上运行了该程序. 显然,该程序在最新的C11标准中编译时会产生错误. 但是,当用 -std = C90 和 -Std = C99 标志编译时,它也会产生错误.鉴于,_ generic关键字仅在C11标准中引入. -STD =标志的行为不同吗?有没有办法测试纯C90和C99标准? 编辑: 我确实与其他标识符运行了相同的程序,这些标识符不是C11标准.喜欢: int _Hello; int _Gener; 他们成功地编译了没有任何错误或警告. 这可能是由于7.1.3,说 如果程序声明或定义了标识符 保留它的上下文(除了7.1.4允许以外)或定义保留的上下文 标识符是宏名称,行为是未定义的 @art和@lundin所说.
4 2024-04-10
编程技术问答社区
如何保存typeof的结果?
我是一个新的程序员,主要使用Code :: C 99 的块. 我最近发现了有关typeof()的信息,因为它被隐藏为__ typeof __() 我想知道您是否可以通过类型保存类型.类似: type a = __typeof__(?); 或 #define typeof __typeof__ type a = typeof(?); 这可能吗? 解决方案 您应该避免typeof或__typeof __()因为它们不是标准C.最新的C版本(C11)通过以相同方式工作的_Generic关键字对此进行了支持. C中没有"类型",但是您可以轻松地自己制作一个: typedef enum { TYPE_INT, TYPE_FLOAT, TYPE_CHAR } type_t; #define get_typeof(x) \ _Generic((x), \ int: TYPE_INT, \ float:
10 2024-04-10
编程技术问答社区
使用ncurses的C99 UTF8字符
我正在玩ncurses,并且遇到了一个问题.我想绘制一个带有Unicode块字符(u+2588,█)的简单盒子,但是我无法正确显示它: 如您所见,我想要的字符显示为~H. 我遵循了类似的问题到发球区.最小工作示例: #include #include int main() { setlocale(LC_ALL, ""); // must be caled before initscr WINDOW *win = initscr(); int w, h; getmaxyx(win, h, w); // should fill the left half of the // terminal window with filled block characters int i, j; for (i = 0; i
10 2024-04-09
编程技术问答社区
是否有可能为一个移动的GC实现生成带有类型信息的ansi C函数?
我想知道有哪些方法可以在生成的C方法中添加键入信息.我正在将高级编程语言转换为C,我想添加一个移动的垃圾收集器.但是,为此,我需要方法变量具有输入信息,否则我可以修改看起来像指针的原始值. 一种显而易见的方法是将所有(原始和非关键)变量封装在具有额外(枚举)变量的结构中,但是这会导致内存和性能开销,而the式的代码是指用于嵌入式平台.如果我要接受内存台面,那么明显的选项将是为所有对象使用堆句柄,然后我能够自由移动堆块.但是我想知道是否有更有效的方法. 我提出了一个潜在的解决方案,即是基于原始词是否基于原始变量(我可以在转板器中执行此操作),并在末尾向每个方法添加一个偏移变量(i在扫描堆栈区域时,需要能够准确地找到它,这告诉我非重要变量从哪里开始以及它们结束的地方,因此我只能扫描这些变量.这意味着每种方法都将使用其他16/32位(取决于拱门)的内存,但是这仍然比Heap Hander方法更有效. 示例: void my_func() { int i = 5;
2 2024-04-09
编程技术问答社区
标准C语言中是否需要字面后缀?
已经有一个问题已经回答了可变声明的特定情况,但是其他字面常数的用途又如何呢? 例如: uint64_t a; ... int32_t b = a / 1000000000; 最后一块代码等效于任何标准C编译器中的下一个代码? uint64_t a; ... int32_t b = (int32_t)(a / UINT64_C(1000000000)); 换句话说,Xintn_c宏是否根本不需要(假设我们在隐式一个错误的情况下使用显式铸造)? )? 编辑 当编译器读取1000000000时,是否允许将其存储为int在内部表示中(掉落到溢出的位),或者必须将其存储在最高可能的精度(长)之前,直到它解析整个表达式类型?它是实现定义的行为还是由标准授权? 解决方案 您的第二个示例无效C99,看起来像C ++.也许想要你想要的是演员,即(int32_t)(a / UINT64_C(1000000000))? a / UINT64_C(10000
6 2024-04-09
编程技术问答社区
ISO/IEC 9899 6.8.4.2 ->2这句话是什么意思?
我不明白这意味着什么. 我已经认为这可能意味着代码,就像我的代码段一样: 通过false loop跳过开关案例操作? 但是,作为答案者将在哪里改进代码,而忽略了我对C99报价的问题,我现在将在这里明确地问: 如果开关语句在一个范围内具有关联的情况或默认标签 具有变化类型的标识符,整个开关语句应在 该标识符的范围135) 这是脚注: 135)也就 与包含声明的块中的开关关联的默认标签. 换句话说,任何人都能如此友善地向我解释吗? 感谢您的努力. 解决方案 首先要注意,此句子仅适用于可变修改类型的标识符,该类型是其描述中某处具有动态数组维度的类型.对于n 之类的变量 double a[n]; unsigned (*B)[n][n]; 与此类标识符相关的对象具有特殊的规则,只有在声明点开始,而对于其他类型,它始于进入范围. 您引用的段落是为了确保switch语句的所有case根据该对象上的寿命具有相同的属性.物体的寿命已经开始,在任何情
2 2024-04-09
编程技术问答社区
具有静态存储时间和相等的、恒定的初始化器的恒定对象能否被凝聚?
考虑两个具有静态存储持续时间和相等恒定初始化器的对象: static const int a = 50; static const int b = 50; 编译器组合它们是否有效,使得&a == &b? (对于上下文,我正在考虑使用静态常数对象以获取唯一的地址作为前哨指针值.如果编译器合法地组合此类对象是合法的,并且我对两个这样的对象使用相同的常量值,则这些地址可能是平等的,我不能将它们用作哨兵值.) 解决方案 指针必须比较不等.参见C99 6.5.9第6段: 两个指针比较时,并且仅当两个指针都是无效的指针时,两个指针都是对对象的指针(包括对象的指针和函数的指针)同一数组对象,或一个是一个指向一个数组对象末端的指针,另一个是指向不同数组对象的开始的指针,该指针恰好在地址空间中立即遵循第一个数组对象. 其他解决方案 否,标准的禁止.不同的对象必须具有不同的地址.在const char a[]="abc", b[]="abc";中,a和b在不同的地址分配
2 2024-04-09
编程技术问答社区
为什么打包在同级联合体或结构之间不起作用?
在下面的示例中,我希望complex_t的大小与uint16_t:2个字节相同,但是是3个字节. 删除第二个联合(" proximity_unsafe")将大小降低到2个字节,但我无法弄清楚包装规则的模型. #include #include typedef union { uint16_t unsafe; struct { uint16_t backwardmotion_unsafe : 1; uint16_t batteryvoltage_unsafe : 1; union { uint16_t dropoff_unsafe : 4; struct { uint16_t dropofffrontleft_unsafe : 1; u
2 2024-04-09
编程技术问答社区
在C语言中使用GCC-多参数函数进行函数重载
在上一个问题中,当每个函数仅采用一个参数时,我找到了一种在C99中超负荷功能的方法.请参阅以下答案:使用GCC中的C函数过载 - 使用GCC-编译器警告有关详细信息 . 现在,我已经找到了一种使用单个参数函数来完成的方法,我想知道如何为采用多个参数的函数做到这一点.我认为这将与__VA_ARGS__有关,并且使用...,但我似乎找不到任何有效的东西甚至想编译的东西. 这将适用于获得2个参数的打印: #define print(x, y) \ __builtin_choose_expr(__builtin_types_compatible_p(typeof(x), int) && \ __builtin_types_compatible_p(typeof(y), int), print_int,
10 2024-04-09
编程技术问答社区
如何抑制C99风格的结构成员初始化的PC-Lint错误?
我使用的是PC-lint 8.00x,具有以下选项: +v -wlib(1) +fan +fas 当我运行代码类似以下代码时,我会从PC-LINT中收到许多错误消息: typedef union { struct { unsigned int a : 4; unsigned int b : 4; unsigned int c : 4; unsigned int d : 4; } bits; unsigned short value; } My_Value; int main (void) { My_Value test[] = { { .bits.a = 2, .bits.b = 3, //Errors 133 and 10 .bits.c = 2,
18 2024-04-09
编程技术问答社区
如何向一个函数传递无穷大的值并测试结果
我有此功能: #include complex double f(complex double x, complex double y) { return x*y; } 我想用x = inf + i inf和y = i inf称呼它,看看结果是什么.特别是我要测试结果是无限值(应该是)还是NaN + iNaN.原因是要测试不同的C编译器. 您如何在C? 中执行此操作 解决方案 我也会添加一个中间检查: #include #include #include #include complex double f(complex double x, complex double y) { return x*y; } int main(void){ complex double x = INFINITY + INFINITY * I; comp
2 2024-04-09
编程技术问答社区