小编Joh*_*inz的帖子

在C中移动Linux上的文件

  • 平台:Debian Wheezy 3.2.0-4-686-pae
  • 编译器:GCC(Debian 4.7.2-5)4.7.2(代码::块)

我想将文件从一个位置移动到另一个位置.没有什么比移动到不同的驱动器或不同的文件系统更复杂.我知道执行此操作的"标准"方法是简单地复制文件然后删除原始文件.但我想要一些方法来保留文件的所有权,模式,上次访问/修改等.我假设我将不得不复制文件,然后编辑新文件的所有权,模式等,但我不知道如何做到这一点.

c linux

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

非阻塞获取角色

  • 平台:Linux 3.2.0 x86(Debian 7)
  • 编译:GCC 4.7.2(Debian 4.7.2-5)

我正在编写一个函数,如果stdin中已存在一个字符,则从stdin中读取单个字符.如果stdin为空,则该函数假设不执行任何操作并返回-1.我用Google搜索非阻塞输入并指向poll()select().首先我尝试使用select(),但我无法让它工作,所以我尝试了poll()并得出了相同的结论.我不确定这些函数究竟是做什么的,但是根据我对poll()的文档的理解,如果我这样调用它:

struct pollfd pollfds;
pollfds = STDIN_FILENO;
pollfds.events = POLLIN;
poll(pollfds, 1, 0);
Run Code Online (Sandbox Code Playgroud)

if(pollfds.revents&POLLIN)如果"可以在不阻塞的情况下读取高优先级数据以外的数据",则为真.但是poll()总是在我的测试情况下超时.我如何测试函数可能是问题,但我想要的功能正是我正在测试的.这是当前的功能和测试情况.

#include <poll.h>
#include <stdio.h>
#include <unistd.h>

int ngetc(char *c)
{       
    struct pollfd pollfds;
    pollfds.fd = STDIN_FILENO;
    pollfds.events = POLLIN;

    poll(&pollfds, 1, 0);

    if(pollfds.revents & POLLIN)
    {
            //Bonus points to the persons that can tell me if
            //read() will change the value of '*c' if an error
            //occurs during the read
        read(STDIN_FILENO, c, 1);
            return 0; …
Run Code Online (Sandbox Code Playgroud)

c linux stdin polling

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

如何使用C套接字ping

  • 编译器:Code :: Blocks(GNU GCC)
  • 平台:Windows(x86)
  • 包括:winsock.h winsock2.h(ws2_32也链接)

我目前正在尝试编写一个程序,该程序将读取包含IP地址列表的文本文件,并分别ping每个IP地址.如果主机响应ping,则主机的IP地址将被复制到用户指定的借调文件中.不经意的是,这是我第一次使用C的套接字库,我找不到关于如何使用C进行ping的好教程.据我所知,我找到了几个教程.我需要在IP数据报中包含一个ICMP头,它是一个包含ICMP类型,代码和校验和的结构.但我不知道该怎么做,我应该自己声明结构还是在头文件中声明?我假设它在一个标题中但是教程相互矛盾的确切地说明了它的位置.我厌倦了包括icmp.h和netinet/icmp.h,但我的编译器抱怨它们不存在所以我创建了自己的结构.

    struct echo_request
    {
        char type; // Type
        char code; // Code
        short checksum; // Checksum
        short id; // Identification
        short seq; // Sequence
        int time; // Time
        char data[16]; // Data
    };
Run Code Online (Sandbox Code Playgroud)

我认为我可能能够逃脱它,但我甚至无法编译我的程序,因为我的编译器说in_cksum()(校验和生成器)是未定义的.

总结我的问题,我应该包括哪些头文件,如何创建ping数据包,我使用正确的校验和生成器函数,ping是否应该指向端口80,我使用的套接字应该是RAW还是DGRAM?

这是我到目前为止,请注意我故意遗漏了错误检查.

    int socket_descriptor = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

    struct sockaddr_in address; //Initialize address struct
    memset(&address, 0, sizeof(address)); //Clear address struct

    //Declare address
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr(ipaddress);
    address.sin_port = htons(80);

    //Bind socket to address
    bind(socket_descriptor, (struct sockaddr *)&address, …
Run Code Online (Sandbox Code Playgroud)

c sockets windows ping icmp

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

C11 Unicode支持

我正在写一些类似于atoi()或的字符串转换函数strtoll().我想要包含一个我的函数版本,它接受char16_t*或char32_t*而不仅仅是char*或wchar_t*.

我的功能很好,但正如我写的那样,我意识到我不明白char16_t或char32_t是什么.我知道标准只要求它们分别是至少16或32位的整数类型,但暗示它们是UTF-16或UTF-32.

我也知道标准定义了几个函数,但它们没有包含任何*get或*put函数(就像它们wchar.h在C99中添加时那样).

所以我想知道:他们期望我用char16_t和char32_t做什么?

c unicode c11

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

C中的IEEE-754浮点异常

我正在用C编写一个浮点计算器接口,该接口允许在运行时访问math.h中定义的数学函数。接口被实现为功能类似于strtold()的函数。它基于ASCII,并且应该像ASCII一样可移植,但是为了实现这一点,我需要以尽可能可移植的方式处理浮点数。我对将支持范围限制为IEEE-754浮点感到满意,但不确定如何处理IEEE-754定义的异常(上溢,下溢等)。首先,我很确定检查所有舍入模式下可用的异常的唯一方法是检查状态标志本身。为了做到这一点,我将需要fenv.h(在C99的附件F中定义),因此我想知道fenv.h在实践中的便携性。我也不太了解fenv。h应该工作;在我看来,状态标志是集中的,但是无论出于什么原因,我印象中每个浮点都有内置的标志。我也知道C99说在math.h中定义的函数可能会上溢和下溢,但我不明白如何检查这些异常。因此,总而言之,我正在寻找一个示例,该示例如何使用fenv.h检查由乘法引起的溢出,并说明如何正确地错误检查math.h中定义的函数。

c floating-point c99 ieee-754

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

生成真正的随机数

可能重复:
有效生成随机数

我需要random numbers在我的C++应用程序中生成.我从阅读这两篇文章中得知 -

http://www.cprogramming.com/tutorial/random.html

写入交流函数,生成一个随机数,或一对随机数,或给定特定范围的随机数的三元组

- 可以使用srand()和生成随机数,rand()但在两种情况下,根据system clock使用的当前时间用作a seed.但我在第一篇文章中读到,rand()如果种子相同,将创建相同的随机数.因此,如果两个不同的用户同时运行我的应用程序,那么他们将具有相同的随机数.这将毫无意义,因为我需要随机数在大多数情况下是唯一的.(我知道如果它们是随机生成的,它们真的是100%唯一的)

所以我的问题是我可以创建一个不基于系统时间的随机种子,如果是这样,为什么rand()用相同的种子生成相同的数字,并且有一种方法可以rand()使用相同的种子生成不同的数字,或者是否有任何其他种子生成随机数的方法?

c++ random unique

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

如何指出错误,因为所有数字都是有效的返回值?

  • 编译器:GCC 4.4.5(代码::块)
  • 平台:Linux内核版本2.6.32-5-686(Debian)

我目前正在编写一个将字符串转换为double longs的函数.我知道已经有一个功能可以做到这一点.我只是为练习写这个功能,但我现在不知道该怎么做.

当我的函数只能处理正双倍长度时,我的函数正常工作,因为如果它们是字符串中的无效字符,我可以返回-1.但是我希望这个函数能够处理负双长以及正负.我不知道在这种情况下我应该做什么,因为现在所有实数都是有效的返回值.我想通过将无效字符转换为十进制值或者只是忽略无效字符并仅选择有效字符0-9(十进制48-57)来继续转换,即使存在无效字符.我还考虑过返回一个指向double long的指针并使用NULL地址来表示找到了一个无效字符,或者我可以errno像设置函数那样设置它readdir().我不确定如何进行设置errno或甚至是否允许.所以我的问题总体上是你们建议我在这种情况下做什么?另请注意,我还没有包括处理负双倍长度,并且该功能将简单地忽略无效字符:例如$&3%7AJ89将转换为3789.

double long cstrtodl(const char *cstr)
{
double long power;
double long dl = 0;
int decimal_place;
int bool_decimal = 0;

for(decimal_place = 1; cstr[decimal_place] != '\0'; decimal_place++)
{
    if(cstr[decimal_place] == '.')
    {
        bool_decimal = decimal_place;
        break;
    }
}

for(decimal_place--, power = 1; decimal_place >= 0; decimal_place--, power *= 10)
{
    printf("[%i] = %i(%c)\nPOWER = %LF\nINTEGER = %LF\n", decimal_place, (int)cstr[decimal_place], cstr[decimal_place], power, dl);
    switch(cstr[decimal_place])
    {
        case …
Run Code Online (Sandbox Code Playgroud)

c

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

可以使用fseek()将数据插入文件的中间吗?- C

我知道函数fseek()可用于将数据输出到文件中的特定位置.但我想知道我是否使用fseek()移动到文件的中间然后输出数据.新数据会覆盖旧数据吗?例如,如果我有一个包含123456789的文件,并且我使用fseek()在5之后输出newdata,那么该文件将包含12345newdata6789,或者它是否包含12345newdata.

c insert fseek

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

Ncurses没有输出

  • 平台:Linux 3.2.0 x86(Debian Wheezy)
  • 编译:GCC 4.7.2(Debian 4.7.2-5)

我正在编写一个程序,需要由ncurses提供的高级终端控制,但我无法让我的程序打印任何东西到stdscr.例如,如果我编译了以下代码,我就不会在屏幕上看到"Testing .. Testing".我之前使用过ncurses,我从未遇到过这样的问题.我不知道这是否相关,但我正在运行全新的Debian安装(我几小时前就安装了它).

#include <ncurses.h>

int main()
{
    initscr();
    printw("Testing... Testing");
    refresh();
    return;
}
Run Code Online (Sandbox Code Playgroud)

上面的程序也编译了,

gcc --all-warnings --extra-warnings -std=c11 filename.c -lncurses
Run Code Online (Sandbox Code Playgroud)

c ncurses

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

忽略分号C语法

  • 平台:Linux 3.2.0 x86(Debian Wheezy)
  • 编译:GCC 4.7.2(Debian 4.7.2-5)

我正在编写一个返回指向char的指针的函数.我仍然想"返回"一个表示发生了什么错误的整数值,因此该函数将一个指向一个将用作标志的整数的指针作为参数.这是声明的一个例子

char* foo(int *flag, etc.)
Run Code Online (Sandbox Code Playgroud)

flag如果用户不想知道发生了什么特定错误,我想允许为NULL,因为它可能无关紧要(我不知道它是否存在,这个想法只是理论上的).如果发生错误,我会写下面的内容,

... //Symbolic Code
if(error) //Some error has occured
{
    if(flag != NULL) *flag = SOME_ERR_VALUE; //Set the flag variable
    return NULL; //return NULL to show that an error occured
}
Run Code Online (Sandbox Code Playgroud)

而不是一遍又一遍地编写代码,我想为它编写一个宏.但是代码不止一个语句,这意味着我必须将宏放在它自己的代码块中,或者宏必须已经在它自己的代码块中.

#define RETFLAG(err, ret) if(flag != NULL) *flag = err; return ret;

... //Symbolic Code
if(error) //Some error has occured
    {RETFLAG(1, NULL)} //Notice the {}
Run Code Online (Sandbox Code Playgroud)

另一种方法是,

//Notice the {} in the definition
#define RETFLAG(err, ret) {if(flag …
Run Code Online (Sandbox Code Playgroud)

c syntax macros

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

空指针的目的

  • 平台:Linux 3.2.0 x86(Debian Wheezy)
  • 编译:GCC 4.7.2(Debian 4.7.2-5)

我在string.h中编写了一些类似于memset(),memcpy()等的函数.我使用void指针来避免使函数类型具体.但是当我使用char指针取消引用void指针时,我不知道为什么我要求一个void指针.在我看来,void指针不做任何事情.所以我的问题是void指针有什么作用?举个例子,这是我的一个功能.

size_t damlocs(size_t sizele, void *val, size_t valsiz, void *ele, size_t elesiz)
{
            //All that 'ele' is used for is this assignment
    char *elebyt = ele;
    char *valbyt = val;
    size_t eleind = 0;
    size_t elebytind = 0;
    size_t valbytind = 0;

    if(elebyt && valbyt)
    {
        while(eleind++ < elesiz)
        {
            elebytind = eleind * sizele;
            valbytind = 0;

            while(elebyt[elebytind++] == valbyt[valbytind++])
                if((valbytind + 1) / sizele == valsiz)
                    return eleind + 1;
        } …
Run Code Online (Sandbox Code Playgroud)

c pointers void

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

寻找分配的内存

  • 平台:x86 Linux 3.2.0(Debian 7.1)
  • 编译:GCC 4.7.2(Debian 4.7.2-5)

我正在编写一个函数,通过读取"随机"值的已分配内存部分来生成"随机"整数.该想法基于未初始化变量具有未定义值的事实.我最初的想法是使用malloc()分配一个数组,然后使用其未初始化的元素生成一个随机数.但malloc()往往会返回NULL内存块,所以我无法保证有任何东西可以读取.所以我考虑读取一个单独的进程内存,以便几乎保证NULL以外的值.我目前的想法是以某种方式找到第一个有效的内存地址并从那里读取,但我不知道如何做到这一点.我尝试将指针初始化为NULL,然后将其递增1,但如果我尝试打印引用的内存位置,则会发生分段错误.所以我的问题是如何读取单独的进程内存.除了阅读之外,我不需要对内存做任何事情.

c linux memory

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

标签 统计

c ×11

linux ×3

c++ ×1

c11 ×1

c99 ×1

floating-point ×1

fseek ×1

icmp ×1

ieee-754 ×1

insert ×1

macros ×1

memory ×1

ncurses ×1

ping ×1

pointers ×1

polling ×1

random ×1

sockets ×1

stdin ×1

syntax ×1

unicode ×1

unique ×1

void ×1

windows ×1