在C中,我经常想要以相同的方式处理从文件读取的数据和从字符串数组中读取的数据.通常从文件读取是用于生产,而字符串用于测试.我最后写了很多像这样的代码:
void handle_line(char *line, Things *things) {
...
}
Things *read_from_chars(char *lines[]) {
Things *things = Things_new();
for (int i = 0; lines[i] != NULL; i++) {
handle_line(lines[i], things);
}
return things;
}
Things *read_from_input(FILE *input) {
char *line = NULL;
size_t linelen = 0;
Things *things = Things_new();
while (getline(&line, &linelen, input) > 0) {
handle_line(line, things);
}
return things;
}
Run Code Online (Sandbox Code Playgroud)
这是一种重复的努力.
有没有办法让一个字符串数组伪装成FILE *指针?或相反亦然?或者是否有更好的模式来处理这个问题?
对于奖励积分:解决方案应该与标准文件函数一样char *或char **可用,如fgets和getline.
struct point {
int x;
int y;
};
main() {
struct point a;
a.x = 5;
a.y = 10;
printf("%d %d", a.x, a.y);
}
Run Code Online (Sandbox Code Playgroud)
输出:
5 10
Run Code Online (Sandbox Code Playgroud)
在这里,如果我想动态添加一个成员(int z)int相同的结构。程序是什么?
我尝试过的:
struct point {
int x;
int y;
};
struct newpoint {
struct point a;
int z;
};
Run Code Online (Sandbox Code Playgroud)
我已经尝试了上述步骤,通过这些步骤我们添加了一个新成员并将旧结构point添加到新结构中newpoint。但这不是我想要的,我想动态添加新成员相同的结构。我在一次采访中得到了这个问题。
我有一个函数,我相信将int转换为浮点值,拆分为值的符号指数和分数组成部分.使用IEEE 754表示浮点值.
unsigned test(unsigned x) {
// split the given bits of sign exponent and fraction, combine to return
unsigned int sign = (x & 0x80000000) >> 31;
unsigned int expo = (x & 0x7F800000) >> 23;
unsigned int frac = (x & 0x007fffff);
return (sign << 31) | (expo << 23) | frac;
}
Run Code Online (Sandbox Code Playgroud)
但我不确定如何从这个浮点表示计算减半或加倍的值.
unsigned doubled(unsigned x) {
// get float
// float = unsigned int to float
// doubleFloat = 2*f
// if float is not a …Run Code Online (Sandbox Code Playgroud) 这个无辜的程序是否会调用未定义的行为:
int main(void) {
printf("%d\n", 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud) c printf undefined-behavior language-lawyer function-prototypes
我和我的同事之间U就十六进制表示的文字后缀有一些争论.请注意,这不是关于此后缀的含义或其后果的问题.我在这里找到了几个主题,但我没有找到我的问题的答案.
一些背景资料:
我们试图达成一套我们都同意的规则,从那时起就将它作为我们的风格.我们有一份2004年Misra C规则的副本,并决定将其作为起点.我们对完全符合Misra C标准不感兴趣; 我们正在挑选我们认为最能提高效率和稳健性的规则.
上述准则第10.6条规定:
"U"后缀应适用于所有无符号类型的常量.
我个人认为这是一个很好的规则.它只需要很少的努力,看起来比显式转换更好,并且更明确地显示了常量的意图.对我来说,将它用于所有未签名的内容是有意义的,而不仅仅是数字,因为通过允许异常来执行规则不会发生,特别是对于常用的常量表示.
但是,我的同事认为十六进制表示不需要后缀.主要是因为我们几乎只使用它来设置微控制器寄存器,并且在将寄存器设置为十六进制常量时,符号性无关紧要.
我的问题
我的问题不在于谁是对还是错.它是关于确定是否存在后缀的缺失或存在改变操作结果的情况.有没有这样的情况,还是一致性问题?
编辑:澄清; 特别是关于通过为它们分配十六进制值来设置微控制器寄存器.是否会出现后缀可能会产生影响的情况?我觉得不会.例如,飞思卡尔处理器专家将所有寄存器分配生成为无符号.
我知道将两个变量初始化为 的单一遍历方法INT_MIN。但我的问题是为什么我们要初始化两个变量INT_MIN以及这里的目的是什么INT_MIN?
为什么我们不能像我在下面的代码中所做的那样将两个变量初始化为其第一个元素?因为当我手动检查代码时,没有发现任何错误。那么为什么代码不能正常运行呢?
#include <stdio.h>
int main(void) {
int x[10];
int i, n;
int first = x[0];
int second = x[0];
printf("Input the size of array :");
scanf("%d", &n);
printf("Input %d elements in the array :\n", n);
for (i = 0; i < n; i++) {
printf("x[%d]: ", i);
scanf("%d", &x[i]);
}
for (i = 0; i < n; ++i) {
if (first < x[i]) {
second = first;
first = x[i];
} else …Run Code Online (Sandbox Code Playgroud) 这个算法是mergesort,我知道这可能看起来很奇怪,但我主要关注的是计算这个算法的空间复杂度.
如果我们查看mergesort函数的递归树并尝试跟踪算法,那么堆栈大小将是log(n).但由于merge功能也有内部的mergesort,其产生的大小两个数组n/2,n/2,那么首先应该我觉得递推关系的空间复杂度,然后,我要补充的是中n/2 + n/2,这将成为O(log(n) + n).
我知道答案,但我在这个过程中感到困惑.谁能告诉我正确的程序?
这种混淆是由于合并函数,它不是递归的,而是在递归函数中调用
为什么我们说空间复杂性将O(log(n) + n)通过递归函数空间复杂度的定义,我们通常计算递归树的高度
Merge(Leftarray, Rightarray, Array) {
nL <- length(Leftarray)
nR <- length(Rightarray)
i <- j <- k <- 0
while (i < nL && j < nR) {
if (Leftarray[i] <= Rightarray[j])
Array[k++] <- Leftarray[i++]
else
Array[k++] <- Rightarray[j++]
}
while (i < nL) {
Array[k++] <- Leftarray[i++]
}
while (j < nR) {
Array[k++] …Run Code Online (Sandbox Code Playgroud) 从维基百科的文章似乎的补代表性符号整数基本上是过时的,但他们提一些优利系统,即UNIVAC2200分之1100系列作为仍然支持这种表示。
Unisys Clearpath 系列中的最新系统是否仍然支持和使用其补充?
既然他们使用intel芯片,他们需要模拟器吗?这性能如何?
是否有针对这种架构的 C 编译器?
我正在尝试创建我自己的 C 函数版本,当我到达时,memcpy我memset认为我应该将目标和源指针转换为char *. 然而,我见过很多指针被转换到的例子unsigned char *。这是为什么?
void *mem_cpy(void *dest, const void *src, size_t n) {
if (dest == NULL || src == NULL)
return NULL;
int i = 0;
char *dest_arr = (char *)dest;
char *src_arr = (char *)src;
while (i < n) {
dest_arr[i] = src_arr[i];
i++;
}
return dest;
}
Run Code Online (Sandbox Code Playgroud) 所以我通读了其他问题,他们被告知放在#define _GNU_SOURCE任何包含之前,它会起作用,但对我不起作用。我也尝试添加#define _GNU_SOURCE char *strcasestr(const char *haystack, const char *needle);但仍然不起作用。我找不到关于此的任何其他信息,也许有人可以提供帮助?提前致谢。
错误:函数“strcasestr”的隐式声明
/**
*
* Description: This is code for Lab 3 Task 2.
* Reads data from file and gives opportunity to search by cities
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
printf("Please input the city you want to find employees in:");
scanf("%s", input);
maxline = i;
for (i = 0; i <= maxline; i++) {
if (strcasestr(employee[i].city, input) != 0) { // PROBLEM …Run Code Online (Sandbox Code Playgroud)