当我尝试读取/解析输入时,我的C程序出现问题.
救命?
这是一个FAQ条目.
StackOverflow有许多与C中读取输入相关的问题,答案通常集中在特定用户的特定问题上,而不是真正描绘整个画面.
这是一次全面覆盖一些常见错误的尝试,因此只需将这些错误标记为重复,就可以回答这一特定问题:
scanf("%d", ...)/ scanf("%c", ...)失败?gets()崩溃?答案被标记为社区维基.随意改进和(谨慎)扩展.
我是c编程的新手,我编写了一些简单的程序"Hello world"风格.
在所有这些程序中,我放在#include<stdio.h>顶部,但我不确定这究竟是什么意思.我用谷歌搜索它,我发现stdio.h是一个具有预处理器命令的文件,但什么是预处理器?我想当我编写代码时,我编译它并且我的代码转换为"计算机"可以读取的形式然后我可以运行它.有人可以向我解释这个命令的用法是什么吗?
我写过一本表现不佳的翻译,几周来一直在苦苦挣扎.在下面简单的bechmark
#include<stdio.h>
int main()
{
int x;
char buf[2048];
FILE *test = fopen("test.out", "wb");
setvbuf(test, buf, _IOFBF, sizeof buf);
for(x=0;x<1024*1024; x++)
fprintf(test, "%04d", x);
fclose(test);
return 0
}
Run Code Online (Sandbox Code Playgroud)
我们看到以下结果
bash-3.1$ gcc -O2 -static test.c -o test
bash-3.1$ time ./test
real 0m0.334s
user 0m0.015s
sys 0m0.016s
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在添加"-std = c99"标志的那一刻,性能崩溃了:
bash-3.1$ gcc -O2 -static -std=c99 test.c -o test
bash-3.1$ time ./test
real 0m2.477s
user 0m0.015s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
我正在使用的编译器是gcc 4.6.2 mingw32.
生成的文件大约是12M,所以这两者之间的差异大约为21MB/s.
运行diff显示生成的文件是相同的.
我认为这与文件锁定有关fprintf,程序大量使用,但我无法找到在C99版本中关闭它的方法.
我尝试flockfile了在程序开始时使用的流,并funlockfile在最后使用了相应的流,但是遇到了关于隐式声明的编译器错误,以及声称对这些函数的未定义引用的链接器错误. …
这些getch和getchar功能之间的确切区别是什么?
我想要一个最小的o-damn-malloc-just-failed处理程序,它将一些信息写入文件(可能只是标准错误).我更喜欢使用fprintf()而不是write(),但如果fprintf()本身尝试使用malloc(),则会失败.
是否有一些保证,无论是在C标准,还是只是在glibc,fprintf不会这样做?
通过使用fdopen(),fileno()可以使用现有文件描述符打开流.然而,正确的方法关闭文件,一旦你与流打开它要fclose()的FILE指针.如何关闭流,但保留打开的文件描述符?
此行为类似于调用fflush()然后再次fileno()使用FILE指针,除非在关闭时.另一个问题是,如果你fdopen()再次,现在有多个FILE指针,你只能关闭其中一个.
scanf(" %[^\n]",line);
Run Code Online (Sandbox Code Playgroud)
我的一个朋友建议使用fgets()读取一行作为输入比使用scanf()上面的声明更好.他有道理吗?
我知道大多数编译器都允许:
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)
//和
#include <cstdio>
Run Code Online (Sandbox Code Playgroud)
但有人认为<stdio.h>实际上并不是C++标准.
真的吗?
我正在移植一些现有的C代码以在Android上运行.此C代码将大量输出写入stdout/stderr.我需要在内存缓冲区或文件中捕获此输出,以便我可以通过电子邮件或其他方式共享它.
如何在不修改现有C代码的情况下实现这一目标?
注意:这个问题不是关于将输出重定向到adb或logcat; 我需要在设备上本地缓冲输出.我知道以下问题,但似乎没有解决我的问题:
我有一个Java线程:
class MyThread extends Thread {
@Override
public void run() {
BufferedReader stdin =
new BufferedReader(new InputStreamReader(System.in));
String msg;
try {
while ((msg = stdin.readLine()) != null) {
System.out.println("Got: " + msg);
}
System.out.println("Aborted.");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
在另一个线程中,如何stdin.readline()在此线程中中止调用,以便打印此线程Aborted.?我试过了System.in.close(),但这没有任何区别,stdin.readline()仍然是阻塞.
我对没有的解决方案感兴趣
System.in).