小编CIs*_*ies的帖子

windows下C程序有多少种执行系统命令的方法

我正在使用 MS Visual Studio 2008 进行 C 编码。

我知道我们可以使用“ int system(const char *command)”来执行命令。

有没有其他方法可以在C程序中执行系统命令。我还需要将执行命令的输出存储在变量中。

system()函数执行命令并将输出发送到stdout,有什么方法可以读取stdout变量并将其存储在变量中。

所以我的最终目标是在 Windows 的 C 程序中执行系统命令(使用 Visual Studio)并将该命令的输出存储在变量中。有什么建议 ?

c

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

仅当重要指针被覆盖时,缓冲区溢出才会引起段错误吗?

假设我有一个程序声明了一个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)

当使用“合法输入”运行它(意思是-不溢出第二个缓冲区)时,这没问题。即使我稍微溢出了缓冲区也可以,但是输入太多之后,程序崩溃了。

据我了解,这(意味着-不溢出第二个缓冲区)应该不会导致任何崩溃。可能导致崩溃的原因是破坏了保存指令指针的内存,因此它现在指向无效的地址(这是页面错误吗?)。

它是否正确?不影响堆栈/框架/指令指针的错误写入是否会导致崩溃?

c pointers buffer-overflow segmentation-fault

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

如何软件分开开关盒内的盒子

我有一个开关案例有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 …

c switch-statement

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

使用 open 时什么会导致无限循环?(C、UNIX)

我使用这个创建了一个 fifo:mkfifo("myfifo", 0666);
现在,我想使用它打开它,inf fd = open("./myfifo",O_WRONLY);但这会让我进入无限循环,为什么?

c unix infinite-loop mkfifo

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

cprinting使用整数赋值给字符的Ascii

我试图打印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)

c ascii char

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

未知类型名称C vs C++

我试图创建一个包含指向其类型的指针的结构:

#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)

c struct compiler-errors

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

如何最佳地复制功能

我有一个通过轮询调用的函数(每10毫秒),它检查它的开始:

if(input != saved_data)
    return;
// rest of the function...
Run Code Online (Sandbox Code Playgroud)

虽然这个检查节省了很多时间,但有时它是错误的,我正在调试我需要继续执行该功能的情况,尽管如此input == saved_data.

我想到了两个选择:

  1. 在参数列表中添加一个"force"标志,虽然它是真的,但if将被忽略
  2. old_function_force使用相同的代码创建一个新函数,if除外

我选择了选项2,因为我不想修改函数的所有其他调用,我希望代码向后兼容,但我发现我的解决方案也很糟糕,因为当有人应该改变old_function他的意愿时可能忘记改变我的,这会导致新的错误

除了这两个之外还有更好的解决方案,还是改进其中一个的方法?

c

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

使用列表理解创建 2 数字元组列表,其中所有可能的对最多为 N

我想创建一个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)]可以解决它。谢谢并抱歉

python list-comprehension

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

通过保留最小线宽替换多行字符串中的char

我有一个多行字符串,应该保持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规则的空格),并且只删除了空格)但是有更好的方法这样做?

python string

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

如果我打开文件而不分配文件,它会保持打开状态吗?

我知道

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的垃圾收集器关闭了。

  1. 我对吗?
  2. 这是一个好习惯吗?
  3. 这里的Python版本之间有何区别?

python

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