我正在使用 MS Visual Studio 2008 进行 C 编码。
我知道我们可以使用“ int system(const char *command)”来执行命令。
有没有其他方法可以在C程序中执行系统命令。我还需要将执行命令的输出存储在变量中。
system()函数执行命令并将输出发送到stdout,有什么方法可以读取stdout变量并将其存储在变量中。
所以我的最终目标是在 Windows 的 C 程序中执行系统命令(使用 Visual Studio)并将该命令的输出存储在变量中。有什么建议 ?
假设我有一个程序声明了一个char buffer[size]和另一个变量,并用于gets(buffer);将数据写入buffer。如果gets提供的输入时间过长,则它将从缓冲区溢出,进入下一个变量(假设该变量位于之后的下一个地址中buffer):
void f(){
char str[12] = "hello_world";
char buffer[1];
gets(buffer); // provided with a random char and then "hello_kitty"
printf("str = %s\n", str); // no crash. Just prints "hello_kitty" as expected
}
Run Code Online (Sandbox Code Playgroud)
当使用“合法输入”运行它(意思是-不溢出第二个缓冲区)时,这没问题。即使我稍微溢出了缓冲区也可以,但是输入太多之后,程序崩溃了。
据我了解,这(意味着-不溢出第二个缓冲区)应该不会导致任何崩溃。可能导致崩溃的原因是破坏了保存指令指针的内存,因此它现在指向无效的地址(这是页面错误吗?)。
它是否正确?不影响堆栈/框架/指令指针的错误写入是否会导致崩溃?
我有一个开关案例有4个案例具有相同的通用代码,但我需要为它们不同地初始化变量:
int a,b,c;
switch(type)
{
case A:
case B:
case C:
case D:
foo(a,b,c);
}
Run Code Online (Sandbox Code Playgroud)
我目前所拥有的是一些a = type == A ? 1 : 2;复杂的变量:
if(type == A)
b = 1;
else if(type == B)
b = 5;
else
b = 2;
Run Code Online (Sandbox Code Playgroud)
这有效,但在我看来看起来很难看,而且不是很流利.我可以完全划分案例,但我想在我的代码中避免复制粘贴.
我希望做的是:
int a,b,c;
switch(type)
{
case A:
a = 1;
b = 1;
case B:
a = 2;
b = 5;
case C:
case D:
a = 1;
b = 2;
foo(a,b,c);
}
Run Code Online (Sandbox Code Playgroud)
但这显然不会起作用,因为case D …
我使用这个创建了一个 fifo:mkfifo("myfifo", 0666);
现在,我想使用它打开它,inf fd = open("./myfifo",O_WRONLY);但这会让我进入无限循环,为什么?
我试图打印Ascii字符,我发现使用char c = NUM; printf("%c", c);将适用于某些数字(尝试使用Ascii数字的某些字母表)但有些会导致运行时错误,为什么会这样?
#include <stdio.h>
int main(void) {
for(int i = 0; i < 128; i++){
printf("%c", i); // WORKS FINE
}
for(char c = '!'; c < '~'; c++){
printf("%c", c); //WORKS FINE
}
#if 0
for(char d = 0; d < 128; d++){
printf("%c", d); //IF REMOVED #if 0 --> RUNTIME ERROR
}
#endif
// HOWEVER
char e = 105;
printf("%c", e); //OK
return 0;
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么最后一部分工作而第三部分for循环不是?
在看到下面的答案之后,我明白我的循环已经病态了,我应该在127而不是128停止它.但是,当我尝试这个改变时 - 它根本没有输出:
for(unsigned char …Run Code Online (Sandbox Code Playgroud) 我试图创建一个包含指向其类型的指针的结构:
#include <stdio.h>
struct test{
test* t;
};
int main(){
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc编译时,此代码产生了一个错误:
:5:2:错误:未知类型名称'test'
但是在使用g ++进行编译时,它就可以了.
所以我想要了解的是:
1)是什么导致这种差异?我认为如果gcc使用一次通过编译而g ++使用可以解释它的multipass,但据我所知,这不是真的.
2)如何避免此错误并使用指向它自己类型的指针定义结构?(除非没有其他选择,否则我不想使用void*或使用cast)
我有一个通过轮询调用的函数(每10毫秒),它检查它的开始:
if(input != saved_data)
return;
// rest of the function...
Run Code Online (Sandbox Code Playgroud)
虽然这个检查节省了很多时间,但有时它是错误的,我正在调试我需要继续执行该功能的情况,尽管如此input == saved_data.
我想到了两个选择:
old_function_force使用相同的代码创建一个新函数,if除外我选择了选项2,因为我不想修改函数的所有其他调用,我希望代码向后兼容,但我发现我的解决方案也很糟糕,因为当有人应该改变old_function他的意愿时可能忘记改变我的,这会导致新的错误
除了这两个之外还有更好的解决方案,还是改进其中一个的方法?
我想创建一个2 数字元组的列表-(0,0) , (0,1) , ... (0,N-1) , (1,0) ... (N-1,N-1)使用列表理解。
我使用了这样的东西:[(x,y) for x in range(3) for y in range(x)]其中 3 是我的N,但这显然不起作用(输出[(1, 0), (2, 0), (2, 1)])。
我可以这样做
l = []
for x in range(3):
for y in range(3):
l += [(x,y)]
Run Code Online (Sandbox Code Playgroud)
但我怎样才能用一句话构建我想要的列表呢?
编辑列表理解迭代边界中显然存在一个错误,这让我感到困惑。将其更改为就[(x,y) for x in range(3) for y in range(3)]可以解决它。谢谢并抱歉
我有一个多行字符串,应该保持3的长度.但是,白色空格卡在一个或多个字符串中,我想删除它们:
s = '''123
4 56
7 8'''
print(s)
lines = s.splitlines()
for idx, line in enumerate(lines):
for _ in range(len(line) - len('123')):
lines[idx] = line.replace(' ', '')
s = '\n'.join(lines)
print(s)
123
4 56 # problematic line
7 8
123
456 # fixed line
7 8 # this line should not change, as the white-space here does not make the line longer than length 3
Run Code Online (Sandbox Code Playgroud)
这给了我想要的输出(即所有线都有长度3(我不想删除任何不违反长度为3规则的空格),并且只删除了空格)但是有更好的方法这样做?
我知道
with open(my_file, 'r') as f:
pass
Run Code Online (Sandbox Code Playgroud)
打开和关闭文件。也,
f = open(my_file, 'r'); f.close()
Run Code Online (Sandbox Code Playgroud)
一样。
那这个呢:
open(my_file, 'r')
Run Code Online (Sandbox Code Playgroud)
我的实际问题是这样的:
import json;
json.load(open(my_file, 'r'))
Run Code Online (Sandbox Code Playgroud)
与
import json;
with open(my_file, 'r') as f:
j = json.load(f)
Run Code Online (Sandbox Code Playgroud)
我猜从技术上讲,文件应该保持打开状态,但是我很确定,由于未分配文件对象,因此它立即被Python的垃圾收集器关闭了。