C标准保证这size_t
是一种可以保存任何数组索引的类型.这意味着,逻辑上,size_t
应该能够保存任何指针类型.我在Googles上发现的一些网站上看到这是合法的和/或应该始终有效:
void *v = malloc(10);
size_t s = (size_t) v;
Run Code Online (Sandbox Code Playgroud)
那么在C99中,标准引入了intptr_t
和uintptr_t
类型,它们是有符号和无符号类型,保证能够保存指针:
uintptr_t p = (size_t) v;
Run Code Online (Sandbox Code Playgroud)
那么使用size_t
和有uintptr_t
什么区别?两者都是无符号的,并且两者都应该能够保存任何指针类型,因此它们在功能上看起来相同.除了清晰度之外,是否有任何真正令人信服的理由uintptr_t
(或者更好的是,a void *
)而不是a size_t
?在一个不透明的结构中,字段只能由内部函数处理,有没有理由不这样做?
出于同样的原因,ptrdiff_t
一直是一个能够保持指针差异的签名类型,因此能够容纳大多数指针,那么它与它intptr_t
有何区别?
是不是所有这些类型基本上都服务于同一功能的不同版本?如果没有,为什么?对于其中一个我不能用另一个做什么我不能做什么?如果是这样,为什么C99会在语言中添加两种基本上多余的类型?
我愿意忽略功能指针,因为它们不适用于当前的问题,但随意提及它们,因为我有一种潜在的怀疑,它们将成为"正确"答案的核心.
我想重开stdin
和stdout
(也许stderr
当我在它)的文件句柄,从而使未来的呼叫printf()
或putchar()
还是puts()
会去到一个文件,以及未来的呼叫getc()
和这种将来自一个文件.
1)我不想永久丢失标准输入/输出/错误.我可能希望稍后在程序中重用它们.
2)我不想打开新的文件句柄,因为这些文件句柄必须要么传递很多,要么全局传递(不寒而栗).
3)如果我无法帮助,我不想使用任何open()
或fork()
其他系统相关的功能.
所以基本上,这样做是否有效:
stdin = fopen("newin", "r");
Run Code Online (Sandbox Code Playgroud)
而且,如果确实如此,我怎样才能得到原来的价值stdin
?我是否必须将其存放在一个FILE *
以后才能将其取回?
我试过kill -9 698
但过程没有死.
$ ps -ef | grep chromium
502 698 811 0 0:01.24 ?? 0:07.28 /Users/lucius/chromium/src/xcodebuild/Debug/Chromium.app/Contents/MacOS/Chromium
502 854 732 0 0:00.00 ttys001 0:00.00 grep chromium
$ kill -9 698
$ ps -ef | grep chromium
502 698 811 0 0:01.24 ?? 0:07.28 /Users/lucius/chromium/src/xcodebuild/Debug/Chromium.app/Contents/MacOS/Chromium
502 854 732 0 0:00.00 ttys001 0:00.00 grep chromium
Run Code Online (Sandbox Code Playgroud) 我知道PHP通常用于web开发,那里是没有标准的输入,但是PHP声称是可用作通用脚本语言,如果你不遵循这是时髦的基于web的约定.我知道PHP打印到stdout
(或者你想要调用的任何东西)print
和echo
,这很简单,但我想知道PHP脚本如何从中获取输入stdin
(特别是fgetc()
,但任何输入函数都是好的),或者是这甚至可能吗?
编程.(alt.程序化)
我从来没有使用它,但我在问题中看到了很多,即"如何以编程方式确定[在此插入任务]".Firefox立即告诉我,这两个词都不是真的(至少,它不识别它们).我也从未见过他们在这里使用过的地方.
1)"以编程方式"执行/确定某些内容是什么意思?
2)为什么这么多人会问"如何以编程方式"做某事?是不是假设,如果你问如何在编程帮助板上做某事,你会问"如何"以编程方式"做到这一点?
3)为什么我从未在其他任何地方看到"以编程方式"这个词?
假设我有这三个功能:
bool A();
bool B();
bool C();
Run Code Online (Sandbox Code Playgroud)
如何使用函数指针有条件地调用其中一个函数,如何声明函数指针?
有些人似乎认为C的strcpy()
功能是坏的还是邪恶的.虽然我承认通常最好使用strncpy()
以避免缓冲区溢出,但以下(strdup()
对于那些不够幸运的人来说,这个函数的实现)安全地使用strcpy()
并且永远不会溢出:
char *strdup(const char *s1)
{
char *s2 = malloc(strlen(s1)+1);
if(s2 == NULL)
{
return NULL;
}
strcpy(s2, s1);
return s2;
}
Run Code Online (Sandbox Code Playgroud)
*s2
保证有足够的空间来存储*s1
,并且使用使得strcpy()
我们不必将strlen()
结果存储在另一个函数中以便稍后用作不必要的(在这种情况下)长度参数strncpy()
.然而,有些人用strncpy()
或甚至memcpy()
都需要长度参数来编写这个函数.我想知道人们对此的看法.如果您认为strcpy()
在某些情况下是安全的,请说明.如果你有充分的理由不在strcpy()
这种情况下使用,请给它 - 我想知道为什么使用strncpy()
或memcpy()
在这种情况下可能更好.如果你认为strcpy()
没问题,但不在这里,请解释.
基本上,我只是想知道为什么有些人memcpy()
在别人使用时使用,strcpy()
而其他人则使用普通用户strncpy()
.是否有任何逻辑可以优先选择三个(忽略前两个的缓冲区检查)?
我想在Mac OS X Leopard上安装Git.我正试图避开MacPorts/Fink路线.我也试图避开Google上的安装程序,因为我自己走得很远,但如果必须的话,我会继续下载安装程序.
无论如何,我安装了Git./usr/local/bin/git
.问题是没有安装任何文档,Makefile从不打扰告诉我.所以现在我让Git坐在那里等待使用,因为我尝试为它安装联机帮助页.
由于某些可怕的原因,这些联机帮助页被维护为文本文件,这些文件将由我迅速安装的AsciiDoc程序处理.但是AsciiDoc将这些文本文件转换为XML.
然后Git使用另一个名为xmlto的程序将AsciiDoc吐出的XML转换为联机帮助页(我想 - 我还没有那么远).问题是每当它开始该步骤时我都会收到此错误(第一行是从make输出,其余是错误):
XMLTO git-apply.1
I/O error : Attempt to load network entity http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd
/Users/chrislutz/prog/sources/git-1.6.3.1/Documentation/git-apply.xml:2: warning: failed to load external entity "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
D DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
Run Code Online (Sandbox Code Playgroud)
所以基本上它只是遍历每个文件并给我所有这些错误.
我曾尝试过一次下载文件http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd
,将其放在目录中,然后将XML文件中的所有引用更改为目录中的文件,但这给了我更多更奇怪的错误.如果我有一个常规的工作解决方案,它可能仍然会给我那些陌生人的错误,这意味着整个事情被搞砸了,我将只使用谷歌安装程序.
然而,我自己已经(跌跌撞撞)得到了这一点,我觉得这是松一口气和使用Git的机会之前的最后一步.所以我想做出最后的努力来理解什么是错的.而"最后努力"意味着"Ask Stack Overflow".
因此,如果有人能够让我对这个错误意味着什么以及为什么会发生错误(以及我可以做些什么来修复它)有任何见解,那就太棒了.如果没有,我会尝试使用Google安装程序.
我正在寻找最短,最简单和最优雅的方法来计算给定字符串中的大写字母数.