您好,我正在编写一个简短的程序来实现 shell,但遇到了一个不寻常的问题。由于某种原因,我无法清除 std::cout 缓冲区。该程序不会打印消息。我知道一个简单的解决方案是切换到 std::cerr,但是有没有办法让消息用 cout 打印?我尝试过的事情:
std::cout.flush() std::endl在将任何内容写入标准输出之后插入。std::flush到输出流中std::cout.setf(std::ios::unitbuf);我发现这应该取消缓冲输出。非常感谢任何帮助,这是我的代码:
int main()
{
//Tryed this to unbuffer cout, no luck.
std::cout.setf(std::ios::unitbuf);
std::string input;
//Print out shell prompt and read in input from keyboard.
std::cout << "myshell> ";
std::getline(std::cin, input);
//**********************************************************************
//Step 1) Read in string and parse into tokens.
//**********************************************************************
char * buf = new char[input.length() + 1];
strcpy(buf, input.c_str());
int index = 0;
char * command[256];
command[index] = std::strtok(buf, " "); …Run Code Online (Sandbox Code Playgroud) 我正在使用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 与该问题完全无关)
我开始学习C,我不知道为什么应用程序不断崩溃.
#include <stdio.h>
#include <string.h>
typedef struct
{
char name[50];
int age;
}person;
void initPerson(person *aPerson, char name[50], int age)
{
strcpy(aPerson->name, name); // <- causes a crash
aPerson->age = age; // <- causes a crash
printf("%s", aPerson->name);
}
int main()
{
person *myPerson;
initPerson(myPerson, "Oscar", 45);
printf("%s, %i", myPerson->name, myPerson->age);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经标记了导致崩溃的线条.谁能告诉我这是什么问题?
我需要使用IrDA套接字通信从设备发送命令和读取响应.尽管打包命令非常简单,但无法确定响应的预期大小.例如,命令"GET_ERRORS"导致设备将数据从0返回到n, \n每个分隔的行最多80个字节.我在这里阅读了帖子*,但实际数据块*之前的***标题并未由设备提供给我.
[编辑]
以下是GET_ERRORS命令的典型响应(可读性短缺):
Date Time Fault
10/12/2000 02:00:00 3f46
10/12/2000 02:00:00 bcf5
10/12/2000 02:00:00 1312
10/12/2000 02:00:00 a334
10/12/2000 02:00:00 b212
10/12/2000 02:00:00 b212
10/12/2000 02:00:00 c43a
%
Run Code Online (Sandbox Code Playgroud)
如果我知道返回的数据长度,这个例子(来自这里的SO帖子)效果很好:
int recv_all(int sockfd, void *buf, size_t len, int flags)
{
size_t toread = len;
char *bufptr = (char*) buf;
while (toread > 0)
{
ssize_t rsz = recv(sockfd, bufptr, toread, flags);
if (rsz <= 0)
return rsz; /* Error …Run Code Online (Sandbox Code Playgroud) 我的问题是由于需要double通过void *函数参数正确传递变量。我问,因为在我的机器sizeof(void *)是4,和sizeof(double)是8,铸造一个到另一个好像它应该产生一个问题,但我的编译器(CLANG,对所有的警告)没有给出一个问题的指示,和代码似乎工作美好的。
请注意,我已经看到了这个和这个。他们的标题中有相似的组成词,但没有回答这个特定的问题。
以下是否会导致严格的别名违规错误?或未定义的行为?
// some calling function
double a = 0.000234423;
func1(&a);
...
void func1(void *var)
{
double a = *(double *)(var);
}
Run Code Online (Sandbox Code Playgroud) 我不清楚以下摘录中使用的短语拖尾参数和默认参数提升的含义,这两段似乎几乎是矛盾的,导致我不清楚何时应该预期默认提升。
ISO/IEC 9899:201x第6.5.2.2节函数调用:
float被提升为double。这些被称为默认参数提升。从第 6 段来看,(一种不包含原型的类型)似乎表明只有参数4.0并且5.0将进行默认升级。然后在段。7 它说在最后一个声明的参数之后促销停止。(我相信是b)。似乎暗示a和b将进行提升,但在参数列表中跟随它们的任何内容都不会被提升。但是接下来说默认促销是对尾随参数执行的。尾随表示在 的末尾,表示省略号允许的那些。
那么在调用 f() 时到底提升了什么,为什么?
int f(float a, float b, ...);
int main(void)
{
float a = 1.0;
float b = 2.0;
int res = f(a, b, 4.0, 5.0);
return 0;
}
int f(float a, float b, ...) …Run Code Online (Sandbox Code Playgroud) 这个逻辑是如何工作的: k+=(x=5,y=x+2,z=x+y);
它将如何给出结果 k == 22。当我初始化 k = 10 的值时
#include <stdio.h>
int main()
{
int x,y,z,k=10;
k+=(x=5,y=x+2,z=x+y);
printf("value of k %d ",k); //why it will show value of k =22
return 0;
}
Run Code Online (Sandbox Code Playgroud) float tempC(unsigned int adc_value) {
multiplier = adc_value / 1023.0f;
tempC = -40 * multiplier * 90;
return tempC;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用微控制器上的 ADC 将电位计转换为 -40 到 50 摄氏度之间的温度,这adc_value是 ADC 给出的范围,但是我得到了错误:
Main.c:110:11: 错误:非对象类型 'float (unsigned int)' 不可分配
如果需要,我可以提供更多代码,但我不知道哪里出错了,因为我对 C 和编程还很陌生。
编辑
我已经在这里阅读了问题和答案:指向数组/指针数组的C指针消歧.那里的答案并没有解决我的问题的重点以及下面已经发布的一些答案.这是类似的,但不是重复的.这里的重点旨在集中解释如何()更改声明.链接的重点更广泛,实际上并不围绕()声明的影响和影响,例如我在下面列出的声明.
造成差异的原因是什么?
int *a[5];
int (*a)[5];
被创造了吗?
我对如何()更改声明的解释特别感兴趣.
例如:
随着1)
a[0] = malloc(sizeof(int)); //compiles
Run Code Online (Sandbox Code Playgroud)
但是2)它没有.(错误:数组类型int [5]不可分配)
问题:
1)()in 的影响是2)什么?
2)为什么宣言2会被用于宣言1?
(也就是说,为什么要使用声明2?)
我正在尝试创建一个数组(动态)并用随机数填充它.
我在Linux上.该程序编译没有错误.这是C代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void create_array(int **, int);
void populate_array(int *X, int size, int low, int high);
void display_array(int *X, int size);
int main()
{
int *A = NULL;
int size = 7;
int low = 10;
int high = 1000;
create_array(&A, size);
populate_array(A, size, low, high);
display_array(A, size);
return 0;
}
void create_array(int **X, int size)
{
*X = (int *)(malloc(size));
}
void populate_array(int *X, int size, int low, int high)
{
srand(time(0));
for (int …Run Code Online (Sandbox Code Playgroud) 因此,我有2个程序执行相同的操作,一个用C编写,另一个用Java编写。它们都创建50个线程,并等待所有线程完成,然后终止。
为了了解两个程序之间的时间差,我在Linux中使用了“ time”命令来获取执行时间。
对于C程序,总执行时间为0.020秒,而Java版本花费了0.663秒来完成。
我曾尝试寻找答案,但发现的所有文章(如这 两篇文章)都说Java实际上比C快,我认为这是胡说八道,因此,如果有人可以为我澄清一下,我将不胜感激。 。
谢谢。
这就是C代码的样子。
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#define N 50
void* tproc(void *arg) {
printf("Thread %d\n", *((int *) arg));
return NULL;
}
int main(int argc, char * argv[]) {
int i;
int targ[N];
pthread_t tid[N];
for(i = 0; i < N; i++) {
targ[i] = i;
if(pthread_create(&(tid[i]), NULL, &tproc, &targ[i]) != 0) {
printf("Can't create thread %d\n", i);
return 1;
}
}
for(i = 0; i < N; i++) {
if(pthread_join(tid[i], NULL) != …Run Code Online (Sandbox Code Playgroud)