标签: c

如何写一个整数到一个文件(fprintf和fwrite之间的差异)

我一直在尝试将一个整数写入文件(打开模式是w).fprintf写得正确,但fwrite写了乱码:

int length;
char * word = "word";

counter = strlen(word);
fwrite(&length, sizeof(int), 1, file);
fwrite(word, sizeof(char), length, file);
Run Code Online (Sandbox Code Playgroud)

并且文件中的结果是:

但如果我改用fprintf,就像这样:

int length;
char * word = "word";

counter = strlen(firstWord);
fprintf(file, "%d", counter);
fwrite(word, sizeof(char), length, file);
Run Code Online (Sandbox Code Playgroud)

我在文件中得到了这个结果:

4word

谁能说出我做错了什么?谢谢!

更新:我最终想把写入改为二进制(我将以wb模式打开文件),我的实现会有区别吗?

c printf fwrite

12
推荐指数
1
解决办法
4万
查看次数

如何编写更好的strlen函数?

我正在阅读"写大代码卷2",它显示了以下strlen inslementation:

int myStrlen( char *s )
{
    char *start;
    start = s;
    while( *s != 0 )
    {
        ++s;
    }
    return s - start;
}
Run Code Online (Sandbox Code Playgroud)

该书说,这种实现对于没有经验的C程序员来说是典型的.在过去的11年里,我一直在使用C语言进行编码,我无法在C中看到如何编写比这更好的函数(我可以想到在汇编中编写更好的东西).如何在C中编写比这更好的代码?我看了glibc中strlen函数的标准库实现,我无法理解它的大部分内容.在哪里可以找到有关如何编写高度优化代码的更好信息?

c string optimization pointers c-strings

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

理解"const"在声明中的位置

我很难找到一种直观的模式,用于在C和C++语言中使用const的方式.这里有些例子:

const int a;    //Const integer
int const a;    //Const integer
const int * a;  //Pointer to constant integer
int * const a;  //Const pointer to an integer
int const * a const;    //Const pointer to a const integer
Run Code Online (Sandbox Code Playgroud)

在第1行和第2行中,它似乎const可以在之前或之后出现int,这就是它所修改的内容.

  1. 那么,在第4行,编译器如何决定const修改*(指针)而不是int
  2. 编译器遵循什么规则来决定const适用的内容?
  3. 它遵循相同的规则*吗?

c c++ syntax constants

12
推荐指数
2
解决办法
410
查看次数

C"函数指针"typedef没有星号?

可能重复:
这种typedef是什么意思?功能原型?

今天我遇到了这种语法

typedef double (d2d)(double);
Run Code Online (Sandbox Code Playgroud)

cdecl告诉我它是一个返回double的函数(而不是指向返回double的函数的指针).那么让我们看看它是如何工作的:

#include <stdio.h>

typedef double (d2d)(double);
//typedef double (*d2d)(double); // the "usual" way

double twice(double x)
{
    return x * 2.0;
}

double apply(d2d f, double x)
{
    return f(x);
}


int main()
{
    printf("%f\n", apply(twice, 2.0)); // Prints 4.0000
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,GCC 4.2.1编译它没有问题.我只是想知道这和typedef函数指针的"通常"方式之间的细微差别是什么?

c typedef function-pointers

12
推荐指数
0
解决办法
476
查看次数

获取OpenCV中窗口的大小

我在网上搜索过但无法找到答案,所以我想我可以在这里询问专家.无论如何在OpenCV中获得当前的窗口分辨率?我已经尝试过传递窗口的命名实例的cvGetWindowProperty,但是我找不到要使用的标志.

任何帮助将不胜感激.

c opencv

12
推荐指数
2
解决办法
4651
查看次数

这是有效的C吗?没有关于p未初始化的警告

使用gcc(4.5)编译此代码片段并尽可能多地启用-Wall,-Wextra,-Wuninitialized类型标志,这不会给出任何警告:

int main() {
    int *p = p;
    printf("p = %p\n", (void *)p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但多次运行会产生以下输出:

p = 0xbe9ff4
p = 0x550ff4
p = 0xeb1ff4
p = 0x4caff4
Run Code Online (Sandbox Code Playgroud)

... 等等.

这里发生了什么?

编辑:使用"g ++ -Wall"进行编译,而不是像我期望的那样给出警告:

In function ‘int main()’: warning: ‘p’ is used uninitialized in this function
Run Code Online (Sandbox Code Playgroud)

c gcc

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

使用stddef.h的offsetof而不是滚动自己的可移植性

这是一个挑剔的细节问题,有三个部分.上下文是我希望说服一些人无条件地使用无条件<stddef.h>的定义offsetof而不是(在某些情况下)滚动他们自己的定义是安全的.有问题的程序完全用普通的旧C编写,所以在回答时请完全忽略C++.

第1部分:当以与标准相同的方式使用时offsetof,此宏的扩展是否会引发每个C89的未定义行为,为什么或为什么不行,并且它在C99中是不同的?

#define offset_of(tp, member) (((char*) &((tp*)0)->member) - (char*)0)
Run Code Online (Sandbox Code Playgroud)

注意:人们感兴趣的所有实现都取代了标准的规则,指针只有在指向同一个数组时才能相互减去,通过定义所有指针,无论类型或值,指向单个指针全球地址空间.因此,在争论这个宏的扩张引发未定义的行为时,请不要依赖于该规则.

第2部分:据您所知,有没有一个已发布的生产C实现,当进行上述宏的扩展时,(在某些情况下)会表现出与offsetof使用其宏时的情况不同的行为?

第3部分:据您所知,最近发布的生产C实现是什么,或者未提供stddef.h或未提供offsetof该标题中的工作定义?该实现是否声称符合任何版本的C标准?

对于第2部分和第3部分,请仅在您可以命名特定实现并给出发布日期时回答.说明可能符合条件的实现的一般特征的答案对我没用.

c standards portability

12
推荐指数
2
解决办法
3027
查看次数

在GCC或Cygwin中创建DLL?

我需要帮助将脚本("iterator.c")编译成DLL.我不能用VS2010,因为它支持在C99标准添加到C的功能(我使用"complex.h",但VB不支持它).

我一直在寻找替代品,但我发现的只是GCC,我不知道如何安装/使用(真的,我花了半个小时阅读文档,我甚至不知道如何我应该安装它,和Cygwin,我已经安装但我不知道如何使用它们.另外,我已经安装了MinGW,但我认为它与Cygwin或多或少相同,我仍然不知道如何制作DLL.

这并不像我一直都懒惰甚至没有尝试过,只是因为这些编译器并不像我以前用过的任何东西(主要是Python IDLE和Visual Studio,它们让你很容易).我有点迷茫.

有人可以给我一些关于如何使用这个工具制作我可以从另一个脚本访问的DLL的建议吗?这非常重要.

先感谢您.

c compiler-construction dll gcc c99

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

将条件检查和变量赋值放在一个if语句中

我正在看一些遗留的C代码并感到困惑,它是这样的:

UINT A, B = 1;
if((A = B) == 1){
   return(TRUE);
} else {
   return(FALSE);
}
Run Code Online (Sandbox Code Playgroud)

我们都知道如果我们这样做(A = B)会有编译器警告,但是这里看起来'if'正在检查A对1,我是否正确?

c

12
推荐指数
2
解决办法
3万
查看次数

根据类似英语的字符串对字符串进行评分

我不确定如何确切地说出这个问题,所以这是一个例子:

string1 ="THEQUICKBROWNFOX"string2 ="KLJHQKJBKJBHJBJLSDFD"

我想要一个将string1高于string2和其他一百万个乱码字符串的函数.请注意缺少空格,因此这是逐字符功能,而不是逐字逐句.

在90年代,我在Delphi中编写了一个三元组评分函数,并使用来自Huck Finn的三元组填充它,我正在考虑将代码移植到C或Python或将其插入一个独立的工具,但必须有更有效的方法目前为止.我会这样做数百万次,所以速度很快.我尝试了Reverend.Thomas Beyse()python库并使用一些全部大写字符串训练它,但它似乎需要单词之间的空格,因此返回得分[].我发现了一些马尔可夫链库,但它们似乎也需要在单词之间留出空格.虽然从我对他们的理解,我不明白为什么会这样......

无论如何,我做了很多密码分析,因此将来使用空格和标点符号的评分函数会有所帮助,但是现在我只需要ALLCAPITALLETTERS.

谢谢您的帮助!

c python cryptography cryptanalysis

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