Tag: 标准库

C标准库中的哪些函数通常会鼓励不好的练习?

这是由这个问题和一个特定答案的意见,我得知, strncpy不是一个非常安全的string处理函数在C中,它填充零,直到达到n ,我没有意识到的东西。 具体来说,引用R .. strncpy不会空终止,并且会将目标缓冲区的整个剩余部分填零,这是非常浪费时间的。 你可以通过添加你自己的null填充来解决前者,而不是后者。 它从未打算用作“安全string处理”function,而是用于在Unix目录表和数据库文件中使用固定大小的字段。 snprintf(dest,n,“%s”,src)是标准C中唯一正确的“安全strcpy”,但它可能会慢很多。 顺便说一句,截断本身可能是一个重大的bug,在某些情况下可能会导致特权提升或DoS,所以抛出“安全”的string函数,以截断他们的输出在一个问题不是一种方式,使其“安全”或“安全”。 相反,你应该确保目标缓冲区是正确的大小,并简单地使用strcpy(或更好,如果你已经知道源string的长度,memcpy)。 从Jonathan Leffler 请注意,strncat()在界面上比strncpy()更令人困惑 – 这个长度参数到底是什么呢? 根据你提供的strncpy()等,这不是你所期望的,所以它比strncpy()更容易出错。 对于复制string,我越来越认为有一个强有力的论点,你只需要memmove(),因为你总是提前知道所有的大小,并确保提前有足够的空间。 使用memmove()优先于strcpy(),strcat(),strncpy(),strncat(),memcpy()中的任何一个。 所以,我在C标准库上显然有点生疏。 因此,我想提出一个问题: 哪些C标准库函数被不恰当地/以可能导致/导致安全问题/代码缺陷/低效率的方式使用? 为了客观,我有一些答案的标准: 请,如果可以的话,引用背后的functiondevise理由,即其预期的目的。 请突出显示代码当前被滥用的情况。 请说明为什么这种滥用会导致问题。 我知道这应该是显而易见的,但它防止软性答案。 请避免: 关于命名职能惯例的争论(除非这明确导致混淆)。 “我更喜欢x而y” – 偏好没问题,我们都有,但是我对实际意想不到的副作用感兴趣,以及如何防范。 由于这可能被认为是主观的,并没有明确的答案,我马上标记为社区维基。 我也按C99工作。

是int8_t和uint8_t打算是字符types?

鉴于这个C + + 11程序,我应该期望看到一个数字或字母? 还是不做预期? #include <cstdint> #include <iostream> int main() { int8_t i = 65; std::cout << i; } 标准是否指定此types是否可以是字符types?

标准库中最有用的Python模块?

我在巴黎大学教授研究生水平的Python课程,学生需要介绍标准库。 我想和他们讨论一些最重要的标准模块。 你认为哪些模块是绝对必须的? 即使响应可能取决于你的领域(networking编程,科学等),我觉得一些模块是常见的需要: math , sys , re , os , os os.path , logging ,…也许: collections , struct , … 你会build议我在一个或两个小时的时间内给出什么模块?

Eclipse CDT for C标准库头文件中的“未解决的包含”错误

我为eclipse设置了CDT,并写了一个简单的hello world C程序: #include <stdio.h> int main(void){ puts("Hello, world."); return 0; } 程序build立并正确运行,但是当我把鼠标放在它上面时,eclipse不断的在包含语句的旁边显示这个黄色的问号,这个语句里写着"Unresolved inclusion: <stdio.h>" 。 它不影响程序的运行,但我觉得它很烦人。 有没有人有任何想法如何删除它?

标准库有哪些function必须/应该避免?

我读过堆栈溢出一些C函数是“过时”或“应该避免”。 请给我举一些这样的function和原因的例子吗? 这些function有哪些替代scheme? 我们可以安全地使用它们吗?

连接string不能按预期工作

我知道这是一个普遍的问题,但寻找参考和其他材料,我没有find明确的答案这个问题。 考虑下面的代码: #include <string> // … // in a method std::string a = "Hello "; std::string b = "World"; std::string c = a + b; 编译器告诉我它找不到一个重载操作符char[dim] 。 这是否意味着在string中没有+运算符? 但在几个例子中就有这样的情况。 如果这不是连接更多string的正确方法,那么最好的方法是什么?

为什么从函数返回向量是可以的?

请考虑这个代码,我已经看了几次这种types的代码, words是本地向量,怎么可能从函数返回。 我们可以保证它不会死? std::vector<std::string> read_file(const std::string& path) { std::ifstream file("E:\\names.txt"); if (!file.is_open()) { std::cerr << "Unable to open file" << "\n"; std::exit(-1); } std::vector<string> words;//this vector will be returned std::string token; while (std::getline(file, token, ',')) { words.push_back(token); } return words; }

为什么在标准C ++库中不是int pow(int base,int exponent)?

我觉得我必须无法find它。 是否有任何理由的C + +幂函数不执行除了浮动和双打之外的任何东西的“电源”function? 我知道实现是微不足道的,我只是觉得我正在做一个标准库中的工作。 一个强大的function函数(即以某种一致的,明确的方式处理溢出)并不好玩。

什么是std :: decay,什么时候应该使用?

std::decay存在的原因是什么? std::decay在什么情况下有用?

如何检查一个文件是否存在?

Go的标准库没有一个函数只是用来检查文件是否存在(比如Python的os.path.exists )。 什么是这样做的惯用方法?