有一个很好的方法循环一个字符串sscanf吗?
假设我有一个如下所示的字符串:
char line[] = "100 185 400 11 1000";
Run Code Online (Sandbox Code Playgroud)
我想打印这笔款项.我真正想写的是:
int n, sum = 0;
while (1 == sscanf(line, " %d", &n)) {
sum += n;
line += <number of bytes consumed by sscanf>
}
Run Code Online (Sandbox Code Playgroud)
但是没有干净的方法来获取这些信息sscanf.如果它返回消耗的字节数,那将是有用的.在这样的情况下,人们可以使用strtok,但能够写出类似于你可以做的事情的东西是很好的stdin:
int n, sum = 0;
while (1 == scanf(" %d", &n)) {
sum += n;
// stdin is transparently advanced by scanf call
}
Run Code Online (Sandbox Code Playgroud)
有一个我忘记的简单解决方案吗?
我发现strncpy_s()在VS2013下定义为
errno_t __cdecl strncpy_s
(
_Out_writes_z_(_SizeInBytes) char * _Dst,
_In_ rsize_t _SizeInBytes,
_In_reads_or_z_(_MaxCount) const char * _Src,
_In_ rsize_t _MaxCount
);
Run Code Online (Sandbox Code Playgroud)
rsize_t 是:
typedef size_t rsize_t;
Run Code Online (Sandbox Code Playgroud)
我认为这是Visual Studio的一个技巧.但是,我发现此功能在此页面上定义如下
errno_t strncpy_s
(
char *restrict dest,
rsize_t destsz,
const char *restrict src,
rsize_t count
);
Run Code Online (Sandbox Code Playgroud)
为什么rsize_t定义在这里?如果size_t在这里使用怎么办?有什么特殊情况可以使用rsize_t吗?
我想将一个int数组复制到另一个int数组.它们使用相同的长度定义,因此它们总是具有相同的长度.
memcpy()的size参数的以下两个替代方法的优缺点是什么?
memcpy(dst, src, ARRAY_LENGTH*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
要么
memcpy(dst, src, sizeof(dst));
Run Code Online (Sandbox Code Playgroud)
第二种选择总能奏效吗?无论内容如何?
有利于最后一件事的一件事是,如果阵列要改变,那么更新memcpy()将是一些内容管理.
谢谢
这两个功能有什么区别?我正在使用MinGW 4.8.0.
我知道这gmtime_r是线程安全的(但如果从同一个线程多次调用,则不安全),但我不明白gmtime_s
我有snprintf它可以避免缓冲区溢出,但为什么没有调用函数snscanf?
码:
int main()
{
char * src = "helloeveryone";
char buf1[5];
sscanf(src,"%s",buf1); // here is a array out of bounds
}
Run Code Online (Sandbox Code Playgroud)
所以,我认为snscanf还需要一个.为什么我们只有snprintf?
在I/O安全方面,C标准库非常差.许多函数都有缓冲区溢出(gets,scanf),或者如果没有给出正确的参数(scanf),可能会破坏内存,依此类推.每隔一段时间,我就遇到一位有进取心的黑客,他自己编写了一个缺乏这些缺陷的图书馆.
你见过的这些图书馆有哪些最好的?您是否在生产代码中使用过它们,如果是这样,那么它们不仅仅是业余爱好项目?
在C11中,K.3.7.4.1 memset_s函数,我发现了一些相当混乱的文本:
不同于
memset,memset_s必须严格按照(5.1.2.3)中所述的抽象机规则评估对函数的任何调用。也就是说,对该memset_s函数的任何调用均应假定指示,s并且n将来可能会访问该内存,因此必须包含指示的值c。
这意味着,memset是不(必须的)“进行评价严格按照抽象机的规则”。(所引用的章节是5.1.2.3 程序执行。)
我不明白标准memset在这里明确排除了的余地memset_s,以及这对任何一个函数的实现者意味着什么。
什么是Mac上最好的一站式"安全"C库解决方案?我使用"安全"/"不安全"的引用,因为关于某些标准库函数或其推定改进的替代品的好处存在很多争论.
vfprintf由于可能存在缓冲区溢出或其他安全问题,许多传统的标准C库函数(例如)被认为是不安全的.
在Windows上,Microsoft C/C++编译器提供 "_s"函数(例如vfprintf_s)作为标准库调用的更安全的替代方法.这些功能不是直接替换,因为它们具有提供附加安全信息(例如,缓冲区长度)所必需的不同签名.它们还提供其他功能,例如无效的格式字符串检测,不同的文件安全性等.据我所知,这种实现在Mac上不可用.
Apple(或第三方)是否在OSX上提供与GCC类似的任何内容?
特别是,我正在寻找至少以下功能的"安全"实现:
fopen vfprintf vsprintf sprintf strncpy strcpy strcat
请注意:这个问题与Mac有关.我不是要求你就微软的实现提出你的意见(除非它可以在Mac上使用.)虽然其中一些功能可能很容易自己编写,但并非所有功能都可以.我不是在问自己如何写这些.我不是要求提供有关如何使用STL类来做到这一点的技巧.我不是在问如何关闭警告.我的特殊需求非常具体.我正在尝试确定最佳实践Mac API,它与传统的C库调用尽可能相似,同时增加了安全性.当然,在Mac和Windows(以及其他操作系统)上运行的便携式实现会更好.
让我们看一下qsort_rLinux中的函数(/usr/include/stdlib.h):
typedef int (*__compar_d_fn_t)(const void *, const void *, void *);
extern void qsort_r (void *__base, size_t __nmemb, size_t __size,
__compar_d_fn_t __compar, void *__arg)
__nonnull ((1, 4));
Run Code Online (Sandbox Code Playgroud)
让我们看一下/usr/include/stdlib.hMac中的函数(/usr/include/stdlib.h):
void qsort_r(void *, size_t, size_t, void *, int (*)(void *, const void *, const void *));
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这些声明彼此不同(参数序列).这是令人惊讶的!抱怨在某个地方解决这个问题会有效吗?
_s函数,例如scanf_s,printf_s似乎是可选标准.MSVC实现了这些功能,但gcc没有.
没有实现安全功能的具体原因是什么?是scanf的gcc是否足够安全?