我正在尝试读取返回分隔文件.充满了短语.
我正在尝试将每个短语放入一个字符串中.
问题是当我尝试用文件读取时
fscanf(file,"%50s\n",string);
Run Code Online (Sandbox Code Playgroud)
该字符串只包含一个单词.当它与空间碰撞时,它会停止读取字符串
我一直对编程操作系统感兴趣.通过一些不同的网站进行研究,我遇到了一个有趣的概念(换句话说):如果你开始用#include编写你的引导加载程序,你已经犯了一个致命的错误.
我已经通过了K&R,整本书都包含在每节课中.在整个学习C中使用它,我不知道我学到了什么,使用stdio,什么没有.在没有stdio的情况下,你可以用C做什么?
可能重复:
在linux gcc中使用fork()
#include <stdio.h>
void main ()
{
printf ("ciao");
fork ();
}
Run Code Online (Sandbox Code Playgroud)
我有一些关于C优化的想法,但我不确定.希望你知道答案.
我正在尝试编译显示代码的示例堆栈跟踪.当我用以下代码编译test.c文件时:
gcc -g -rdynamic ./test.c -o test
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
./test.c: In function ‘handler’:
./test.c:16: error: ‘STDERR_FILENO’ undeclared (first use in this function)
./test.c:16: error: (Each undeclared identifier is reported only once
./test.c:16: error: for each function it appears in.)
Run Code Online (Sandbox Code Playgroud)
我的包含与原始邮政编码相同:
#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
Run Code Online (Sandbox Code Playgroud)
我的机器是ubuntu 13.04.我错过了一些图书馆还是没有包含一些内容?
我正在学习Rust,我有点难过.
我正在尝试为用户提供将输出写入stdout或提供的文件名的选项.
我开始与那正是使用给出的示例代码extra::getopts位于这里.从那里,在do_work函数中,我正在尝试这样做:
use std::io::stdio::stdout;
use std::io::buffered::BufferedWriter;
fn do_work( input: &str, out: Option<~str> ) {
println!( "Input: {}", input );
println!( "Output: {}", match out {
Some(x) => x,
None => ~"Using stdout"
} );
let out_writer = BufferedWriter::new( match out {
// I know that unwrap is frowned upon,
// but for now I don't want to deal with the Option.
Some(x) => File::create( &Path::new( x ) ).unwrap(),
None => stdout()
} ); …Run Code Online (Sandbox Code Playgroud) 我产生了一个像这样的子进程:
const n = cp.spawn('bash');
n.stdout.pipe(process.stdout);
n.stderr.pipe(process.stderr);
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个转换流,以便我可以在孩子的每一行的开头添加类似'[child process]'的东西,所以我知道stdio来自孩子而不是父进程.
所以它看起来像:
const getTransformPrepender = function() : Transform {
return ...
}
n.stdout.pipe(getTransformPrepender('[child]')).pipe(process.stdout);
n.stderr.pipe(getTransformPrepender('[child]')).pipe(process.stderr);
Run Code Online (Sandbox Code Playgroud)
有没有人知道是否有这样的现有转换包或如何写一个?
我有这个:
import * as stream from 'stream';
export default function(pre: string){
let saved = '';
return new stream.Transform({
transform(chunk, encoding, cb) {
cb(null, String(pre) + String(chunk));
},
flush(cb) {
this.push(saved);
cb();
}
});
}
Run Code Online (Sandbox Code Playgroud)
但我担心它在边缘情况下不起作用 - 其中一个块突发可能不包含整行(对于很长的行).
看起来这里的答案就在这里:https://strongloop.com/strongblog/practical-examples-of-the-new-node-js-streams-api/
但是这个附录:https: //twitter.com/the1mills/status/886340747275812865
我使用 Visual Studio 安装了 clang,然后按照文档中的说明构建了突出显示的项目。
构建成功了,但是当我尝试这样做时:
clang -cc1 -analyze -analyzer-checker=core.DivideZero test.c
Run Code Online (Sandbox Code Playgroud)
它说:
test.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
^~~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)
我尝试了很多建议,但没有任何效果。
但是,如果我做这样的事情,它会起作用
clang --analyze text.c
Run Code Online (Sandbox Code Playgroud)
我不知道这是否使用了所有可用的检查器。我需要编写自己的检查器并进行测试...
有任何想法吗?
输出 clang --version
clang version 7.0.0 (trunk 322536)
Target: i686-pc-windows-msvc
Thread model: posix
InstalledDir: C:\path\build\Debug\bin
Run Code Online (Sandbox Code Playgroud) 我想从 stdin 读取一行并将其存储在字符串变量中,并将字符串值解析为 u32 整数值。read_line() 方法读取 2 个额外的 UTF-8 值,这会导致 parse 方法崩溃。
以下是我尝试删除回车符和换行符的内容:
use std::io;
use std::str;
fn main() {
let mut input = String::new();
match io::stdin().read_line(&mut input) {
Ok(n) => {
println!("{:?}", input.as_bytes());
println!("{}", str::from_utf8(&input.as_bytes()[0..n-2]).unwrap());
}
Err(e) => {
println!("{:?}", e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 Rust 中执行此操作最惯用的方法是什么?
我有以下代码:
#include <stdio.h>
int main(void)
{
unsigned char c;
setbuf(stdin, NULL);
scanf("%2hhx", &c);
printf("%d\n", (int)c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我设置stdin为无缓冲,然后要求scanf读取最多 2 个十六进制字符。确实,scanf按要求做;例如,将上面的代码编译为foo:
$ echo 23 | ./foo
35
Run Code Online (Sandbox Code Playgroud)
但是,如果我strace编写程序,我发现 libc 实际上读取了 3 个字符。这是来自 strace 的部分日志:
$ echo 234| strace ./foo
read(0, "2", 1) = 1
read(0, "3", 1) = 1
read(0, "4", 1) = 1
35 # prints the correct result
Run Code Online (Sandbox Code Playgroud)
所以 sscanf 给出了预期的结果。但是,正在读取的这个额外字符是可以检测到的,它碰巧破坏了我试图实现的通信协议(在我的例子中是 GDB 远程调试)。
sscanf 的手册页说明了字段宽度:
当达到此最大值或找到不匹配的字符时(以先发生者为准),字符读取停止。
至少,这似乎有点欺骗性;或者它实际上是一个错误?希望使用无缓冲的标准输入,scanf 可能读取的输入量不会超过我要求的输入量,这是否太过分了? …
我试图在 Linux 上诊断用 C 编写的应用程序中的错误。原来这个bug是由于在父进程中句柄仍然打开时在子进程中忘记 引起的。fcloseFILE *
文件操作只是read. 没有写操作。
该应用程序正在运行Linux 5.4.0-58-generic。在这种情况下,错误发生了。
该应用程序正在运行Linux 5.10.0-051000-generic。在这种情况下,没有错误,这正是我所期望的。
fork如果fclose子进程中没有,则父进程执行随机数的系统调用。
我完全知道忘记 fclose会导致内存泄漏,但是:
exit(3)不是_exit(2)。fclose会影响父进程?这是一个 Linux 内核错误,已在5.4. 然而我没有证据,但我的测试向我证明了这一点。
我已经能够通过fclose在退出之前调用子进程来修复这个应用程序错误。但是,我想知道在这种情况下实际发生了什么。所以我的问题是如何fclose在子进程中忘记影响父进程?
fclose在于子进程。test2.c 不会fclose在子进程中调用。123123123
123123123
123123123
123123123
123123123 …Run Code Online (Sandbox Code Playgroud)