小编ryy*_*ker的帖子

c stdout到stdin实时

我制作了两个程序,其中一个名为generator,每秒打印一些文本

int main(int argc, char** argv) {

    for(int i = 0; i < 10 ; i++) {
         printf("something\n");
         sleep(1);
    }

  return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

然后有一个第二个程序现在称它为消费者,它应该从一个标准输入中读取一些其他文本并重新打印它.让它看起来像这样:

 int main(int argc, char** argv) {


   char line[BUFSIZ];

   while(scanf("%s",line) != -1){
       printf("you entered %s \n",line);
   }

    return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

当我编译它们并尝试只运行像./generator这样的生成器时,它按预期工作.每一秒都有东西打印到控制台.但是当我尝试像./generator一样运行它们时 ./consumer它没有像我预期的那样工作.我等了10秒,然后得到了10行 想要打印的东西"你输入的东西"每一秒.

你能解释一下为什么会这样,甚至更好地告诉我如何实现预期的行为?

c linux io pipe

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

在代码中没有明显划分的地方除以零错误

以下代码源自此处的一个问题。(我知道代码有几个逻辑问题,但我不明白它们是如何导致这个问题的。)

编辑: 我在 Windows 上使用 CLANG,并显示常见的编译警告。

它产生在所指示的线被零除故障(第一循环中的语句。),但也有没有明显的分歧。任何人都可以提供一些有关为什么会发生此错误的见解吗?

编辑 2:每评论:将函数中的第三个参数sepia

void sepia(int height, int width, RGBTRIPLE image[height][width])
Run Code Online (Sandbox Code Playgroud)

void sepia(int height, int width, RGBTRIPLE image[3][4])
Run Code Online (Sandbox Code Playgroud)

消除除以零误差。为什么?

typedef struct {
    double rgbtRed;
    double rgbtGreen;
    double rgbtBlue;
}RGBTRIPLE;

RGBTRIPLE image[3][4];

void sepia(int height, int width, RGBTRIPLE image[height][width])
{
    double sepiaRed = 0.0;
    double sepiaGreen = 0.0;
    double sepiaBlue = 0.0;
    // over height
    for (int h = 0; h < height; h++)
    {
        // over width …
Run Code Online (Sandbox Code Playgroud)

c divide-by-zero

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

是否有真正的64位版本的msvcr80.dll?如果没有,为什么不呢?

我已经阅读了链接,回答了是否有64位版本的Visual Studios( Visual Studio 64位?)的问题.简单的答案是没有,但32位的Visual Studio开发环境可以产生64位可执行文件.

问题:

1)是否有64位版本的Microsoft可再发行库msvcr80.dll?我在我的Windows 7,64位机器上安装了可再发行程序包,winsxs子目录中的所有副本(共7个)在其标题部分中指示它们是32位.

2)不是这样的:

a)32位可执行文件无法加载64位dll?

b)64位可执行文件无法加载32位dll?

c)如果确实所有版本的msvcr80.dll都是真正的32位,如每个版本的标题部分所示,使用Visual Studio构建的64位应用程序如何使用此可再发行组件的任何功能?

如果有人找到了这个文件的真正64位版本(msvcr80.dll),即标题部分实际上声明它是64位库,请指向链接.

新增:添加了BeyondCompare Viewer的图像以显示msvcr80.dll标题部分的内容,表示dll的目标是32位使用...

c++ visual-studio-2010

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

使用 C 使用 strftime() 获取缩写时区

我已经在 SO 上查看了thisthis,但它们处理的是同一问题的非 C 变体。

使用带有以下代码的 GNU GCC 编译器(Code::Blocks,在 Windows 中):

int main(void)
{
    time_t rawtime;
    struct tm *info;
    char timeStr[80];

    time( &rawtime );
    info = localtime( &rawtime );

    strftime(timeStr,80,"%a %b %d %H:%M:%S %Z %Y", info);

    printf("%s", timeStr);
    getchar();

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

我得到这个时间字符串:

2016 年 8 月 30 日星期二 14:55:08 太平洋夏令时

除了时区,一切都很好。我更喜欢缩写,例如:

2016 年 8 月 30 日星期二 14:55:08 PDT

strftime() 的每个手册页或 Windows 文档中,我都可以找到格式说明符 %Z 的描述,例如: Timezone name or abbreviation。(例如。这里。)

将时区格式化为缩写的技巧是什么?

c windows strftime

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

char * 的范围与 C 中的 char 数组比较

同一变量的这两种形式,当在功能块的范围内定义时,我认为应该具有相同的范围,即在{...}定义它们的功能块内:

char str1[] = "int_1 < int_2";

char *str1 = "int_1 < int_2";  
Run Code Online (Sandbox Code Playgroud)

但我的观察是,char *生命超出了功能范围,而char []不再存在。str1两种情况下的符号名称都指向变量在内存中创建的位置,那么为什么一个似乎存在于函数之外,而另一个却没有呢?以下代码可用于测试此行为:(#define01 选择一种形式而不是另一种形式以进行说明。)

另请注意,尽管static修饰符可用于修改范围,但此处故意不使用它来观察没有它的行为。

#define DO (1)  //define as either 1 or 0

char * compare_int(int x1, int x2);

int main(void)
{
    int a = 0;
    int b = 0;
    int c = '\n';

    srand(clock()/CLOCKS_PER_SEC);

    while(c != 'q')
    {
        a = rand()%3;
        b = rand()%3;
        printf("%s\n( enter 'q' to …
Run Code Online (Sandbox Code Playgroud)

c scope

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

是否有一种不是 C++ 的“带有类的 C”语言?

我正在寻找某种尽可能简约C但具有内置类支持的 C 方言。C因此,我可以(并鼓励)使用宏、指向数组的指针和手动内存管理,还可以创建类、向它们添加字段和成员函数等。当我尝试在andtypedef struct和函数指针中实现某种 OOP 时,出现了这个问题与我想要的类似,但是“成员函数”需要手动将指向对象的指针作为参数传递给它们,而这不是我想要做的。C++我知道我可以像“带有类的 C”一样写,但是我C++会鼓励不同的编程风格,我很好奇是否有一些东西正是我想要的。

我正在搜索“带有类的 C”,但我只C++在结果中看到,所以我希望答案是“只使用 C++”,我对此表示同意,但我只是好奇。

c oop class dialect

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

使用malloc()/ calloc()创建内存的错误概念

malloc()/calloc()创建内存的方式概念一直是创建一个项目后,对象的地址保持不变.但是我经常用来创建一个字符串数组的函数,以及一个似乎一直运行良好的函数,最近让我质疑我的理解,也就是说,对象的内存地址可以简单地通过调用来移动calloc/malloc.

为了说明,这里是我用来为字符串数组创建内存的函数 - char **:

char ** CreateArrayOfStrings(char **a, int numWords, int maxWordLen)
{
    int i;
    a = calloc(numWords, sizeof(char *));   //create array of pointers
    if(!a) return a;                        //required caller to check for NULL
    for(i=0;i<numWords;i++)
    {
        a[i] = calloc(maxWordLen + 1, 1);   //create memory for each string 
    }
    return a;
}  
Run Code Online (Sandbox Code Playgroud)

在我的系统上,(Win7,32bit编译,ANSI C)该行:

a = calloc(numWords, sizeof(char *));   //create array of pointers  
Run Code Online (Sandbox Code Playgroud)

创建一个连续内存块,大小为numWords char *,在本例中为7,产生28个字节:

在此输入图像描述

内存跨度从地址0x03260080 + 1C(0x0326009C)
或:

a[0] …
Run Code Online (Sandbox Code Playgroud)

c memory-management

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

为什么动态创建的对象与对象的大小相差两倍?

我编写了代码来创建动态创建对象的链接列表:

#include <iostream>
using namespace std;

struct X {
  int i;
  X* x;
};

void birth(X* head, int quant){
  X* x = head;
  for(int i=0;i<quant-1;i++){
    x->i = i+1;
    x->x = new X;
    x = x->x;
  }
  x->i = quant;
  x->x = 0;
}

void kill(X* x){
  X* next;
  while(1==1){
    cout << x->i << endl;
    cout << (long)x << endl;
    next = x->x;
    delete x;
    if(next == 0){
      break;
    } else {
      x = next;
    }
  }
}

int main(){
  cout …
Run Code Online (Sandbox Code Playgroud)

c++ heap-memory

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

禁止在使用 Code::Blocks IDE 创建的应用程序中弹出控制台

我正在使用Code::Blocks版本 13.12 和 GNU GCC 编译器。我最近在 Windows 7 上安装并开始使用这些工具。尽管我不认为语言是一个促成因素,但我使用此环境来创建 C 和 C++ 应用程序。

在获得调试或发布目标可执行文件的干净构建后,然后单击绿色“运行”或红色“调试/运行”工具栏按钮,我看到控制台弹出窗口闪烁(出现,然后关闭),即使对于以下代码不向 写入任何内容stdout。例如...

int main(void)
{
    int a = 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

...产生一个控制台弹出窗口。

谁能描述如何设置 Code::Blocks IDE 来抑制控制台弹出窗口?

注意:我已经在此处此处查看了与此问题相关的答案。这些帖子是相关的,其中一个帖子作为另一个帖子的重复项被关闭,但两者的答案都没有解决这个问题。(即因为我的系统不使用Avast,Avast 与该问题完全无关)

codeblocks

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

c、Ubuntu 中奇怪的终端显示故障

当我运行第一个代码时,它在每个打印语句末尾带有“\n”,它给出了num==情况下的预期输出35

The generated sequence:
35
106
53
160... 
Run Code Online (Sandbox Code Playgroud)

生成 collat​​z 序列的代码:

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>

int main(int argc, char* argv[])
{
    int fd[2], fd1[2], num = atoi(argv[1]), id = getpid();
    
    printf("\nRecieved number: %d\n", num);

    if(num > 0)
    {
        printf("The generated sequence: \n");
        
        while(num > 1)
        {   
            pipe(fd);
            pipe(fd1);

            if(fork()) //parent process
            {
                printf("%d \n", num);
                int n;
                close(fd[0]); //closing read end..
                close(fd1[1]); //closing write end..

                write(fd[1], &num, sizeof(num));
                wait(NULL);
                read(fd1[0], &n, sizeof(n));

                num = n;

                close(fd[1]); …
Run Code Online (Sandbox Code Playgroud)

c ubuntu virtual-machine

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