我一直在测试这个结构,我收到有关使用的警告gets.有人提到要使用fgets而是替换结尾'\0'.任何建议我如何更改我的代码来做到这一点?
void regCars(Car reg[], int *pNrOfCars) {
char again[WORDLENGTH] = "yes", model[WORDLENGTH], tmp[WORDLENGTH];
int year, milage;
while (strcmp(again, "yes") == 0) {
printf("Enter model:");
gets(model);
printf("Enter Year:");
gets(tmp);
year = atoi(tmp);
printf("Enter milage:");
gets(tmp);
milage = atoi(tmp);
reg[*pNrOfCars] = createCar(model, year, milage);
(*pNrOfCars)++;
printf("Continue? (yes/no)");
gets(again);
}
}
Run Code Online (Sandbox Code Playgroud) 很明显,由于算术溢出,以下代码调用未定义的行为:
#include <limits.h>
int test(void) {
int i = INT_MAX;
i++; /* undefined behavior */
return i;
}
Run Code Online (Sandbox Code Playgroud)
但是比小于或int等的签名类型呢?(由较小的,我假定和分别地).shortsigned charSCHAR_MAX < INT_MAXSHRT_MAX < INT_MAX
以下哪个函数调用未定义的行为,为什么?
signed char test2(void) {
signed char i = SCHAR_MAX;
i = i + 1; /* implementation defined */
return i;
}
signed char test3(void) {
signed char i = SCHAR_MAX;
i += 1; /* undefined behavior or implementation defined? */
return i;
}
signed char test4(void) {
signed char …Run Code Online (Sandbox Code Playgroud) 一个char *(合格的变体)可以别名任何东西。是signed char *和unsigned char *(和他们的合格变种)从此免除?
换句话说,如果我不希望restrict将char*函数参数用作其他类型的指针参数的别名(因为它们可以对它们进行别名),则将其应用于函数参数是一个好主意:
int func(struct foo *f, char * restrict s /*different object*/);
Run Code Online (Sandbox Code Playgroud)
可以restrict像这样删除带符号和无符号char变体的关键字吗?
int sfunc(struct foo *f, signed char *s /*different object*/);
int ufunc(struct foo *f, unsigned char *s /*different object*/);
Run Code Online (Sandbox Code Playgroud)
同样,指向相同类型的有符号和无符号变量的指针是否也可以互为别名?换句话说,如果我期望一个指向int的指针和一个指向unsigned的指针,并且它们应该指向不同的对象,则int *和unsigned *参数应该都被restrict限定吗?
/* i and u should be different */
int uifunc(int * /*restrict?*/ i, unsigned * /*restrict?*/ u);
Run Code Online (Sandbox Code Playgroud) 一些 C/C++ 标头前面<sys/ioctl.h>有一个前缀。sys/
(也有一些带有net/前缀。)
为什么是这样?
C99标准:
在上一个和下一个序列点之间,一个对象的存储值最多应通过表达式的评估修改一次
C11标准:
如果一个标量对象的副作用相对于同一个标量对象的另一个副作用是无序的,则行为是未定义的。
那么 C99 标准的这个定义是否不完整,因此它在 C11 中进行了更新,因为它只包含术语object而不包含术语scalar object?
在下面的代码中,似乎 XXXXXX 要求生成随机字符来替换它。这里的XXXXXX是什么意思呢?这是 中的一些特殊保留符号吗sprintf?
sprintf(tempName, "/tmp/%s-XXXXXX", filename.c_str());
Run Code Online (Sandbox Code Playgroud) 我遇到了这个问题.
#include <stdio.h>
int main(void) {
// your code goes here
unsigned int i = 23;
signed char c = -23;
if (i > c)
printf("yes");
else
printf("no");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么这段代码的输出是no.
当C int和charC 之间进行比较时,有人可以帮助我理解比较运算符的工作原理吗?
我和我的同事之间U就十六进制表示的文字后缀有一些争论.请注意,这不是关于此后缀的含义或其后果的问题.我在这里找到了几个主题,但我没有找到我的问题的答案.
一些背景资料:
我们试图达成一套我们都同意的规则,从那时起就将它作为我们的风格.我们有一份2004年Misra C规则的副本,并决定将其作为起点.我们对完全符合Misra C标准不感兴趣; 我们正在挑选我们认为最能提高效率和稳健性的规则.
上述准则第10.6条规定:
"U"后缀应适用于所有无符号类型的常量.
我个人认为这是一个很好的规则.它只需要很少的努力,看起来比显式转换更好,并且更明确地显示了常量的意图.对我来说,将它用于所有未签名的内容是有意义的,而不仅仅是数字,因为通过允许异常来执行规则不会发生,特别是对于常用的常量表示.
但是,我的同事认为十六进制表示不需要后缀.主要是因为我们几乎只使用它来设置微控制器寄存器,并且在将寄存器设置为十六进制常量时,符号性无关紧要.
我的问题
我的问题不在于谁是对还是错.它是关于确定是否存在后缀的缺失或存在改变操作结果的情况.有没有这样的情况,还是一致性问题?
编辑:澄清; 特别是关于通过为它们分配十六进制值来设置微控制器寄存器.是否会出现后缀可能会产生影响的情况?我觉得不会.例如,飞思卡尔处理器专家将所有寄存器分配生成为无符号.
我正在尝试一个非常简单的printf测试:
printf "%.16f\n" 5.10
Run Code Online (Sandbox Code Playgroud)
在linux上,我得到以下输出:5.100000000000000000这是预期的。
但是在OS / X上进行的完全相同的测试会产生以下结果: 5.0999999999999996
为什么printf产生不同的输出?
编辑:这不是C代码,printf还是命令行实用程序,非常适合脚本和测试。
下面的等效C程序产生5.100000000000000000:
printf "%.16f\n" 5.10
Run Code Online (Sandbox Code Playgroud)
编辑2:情节变厚...使这对于linux用户更有趣,如果我以的方式运行此命令,则会nobody得到与OS / X相同的行为:
chqrlie$ printf "%.18f\n" 5.10
5.100000000000000000
chqrlie$ su nobody -c 'printf "%.18f\n" 5.10'
5.099999999999999645
Run Code Online (Sandbox Code Playgroud) 我正在为我的算法类做作业,我必须证明内部合并排序的时间复杂度为O(n log n)。为此,我创建了长度从 10,000 个元素到 75,000 个元素的数组。然后我用低于 10,000 的随机数加载数组,并将数组长度输出到控制台,并显示排序所需的时间。
奇怪的结果是,有些需要大约 15 毫秒的时间,而另一些则需要 0 毫秒,即使数组长了数万个整数。知道为什么会这样吗?我可以上传我的输出的屏幕截图,但需要有人批准它,因为我没有足够的“声誉”。我已经检查了数组。调用该方法后,它们似乎确实已排序mergeSort()。
public static void main(String[] args){
int[] dataLength = { 10_000, 15_000, 20_000, 25_000, 30_000,
35_000, 40_000, 45_000, 50_000, 55_000,
60_000, 65_000, 70_000, 75_000 };
// internal merge sort
for (int i = 0; i < dataLength.length; i++) {
int[] input = new int[dataLength[i]];
for (int j = 0; j < input.length; j++) {
input[j] = random.nextInt(10000);
}
long startTime = System.currentTimeMillis();
mergeSort(input, …Run Code Online (Sandbox Code Playgroud)