ISO C委员会(ISO/IEC JTC1/SC21/WG14)已发布TR 24731-1,正在研究TR 24731-2:
TR 24731-1:C库的扩展第一部分:边界检查接口
WG14正在研究更安全的C库函数.该TR旨在通过添加具有缓冲区长度的额外参数来修改现有程序.最新草案见N1225号文件.理由是在N1173号文件中.这将成为技术报告类型2.
TR 24731-2:C库的扩展 - 第二部分:动态分配功能
WG14正在研究更安全的C库函数.该TR面向使用动态分配而不是缓冲区长度的额外参数的新程序.最新草案见N1337号文件.这将成为技术报告类型2.
我有一个irc_sendline可以像printfcan 一样调用的函数
irc_sendline(s, "A strange game.\nThe only %s is not to play.", "winning move");
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但我对它的实现不满意:
int irc_sendline(irc *iobj, char *msg, ...)
{
char tmp_msg[BUFSIZE], fmsg[BUFSIZE];
va_list args;
int len;
va_start(args, msg);
strncpy(tmp_msg, msg, BUFSIZE);
strncat(tmp_msg, "\r\n", BUFSIZE);
len = vsnprintf(fmsg, BUFSIZE, tmp_msg, args);
len = send(iobj->fd, fmsg, len, 0);
return len;
}
Run Code Online (Sandbox Code Playgroud)
你看,我在这里使用2个"临时"缓冲区,因为我首先必须将原始消息从函数参数复制到临时缓冲区,以便将"\ r \n"附加到它,然后将该临时缓冲区复制到另一个临时缓冲区做函数调用中提供的参数实际的格式化,只有那么我可以在它的途中送东西.
我怎么能让这个更干净,更好?
感谢这里的所有输入,我认为我唯一的问题是那里的混乱,但它实际上是一个滴答作响的定时炸弹!我的新功能如下所示:
int irc_sendline(irc *iobj, char *msg, ...)
{
char buffer[BUFSIZE];
va_list args;
int res_str_len;
int sent; …Run Code Online (Sandbox Code Playgroud) 我很担心 C 中的字符串。我需要设置最后一个字符 \0 还是它自己设置?如果我不手动执行,那么当我尝试调试代码以及访问 string1[257] 时它不为空。我在释放字符串数组的分配内存时遇到问题,所以我认为这是一个原因。
char string1[257], string2[257];
scanf("%s", &string2);
string1[257] = '\0';
strncpy(string1, string2, 257);
string1[257] = '\0'; /* do I need to do that? */
Run Code Online (Sandbox Code Playgroud) 我把c定义为
char c[][10]
Run Code Online (Sandbox Code Playgroud)
在函数定义中使用它 c[i]="gray";
怎么了?我在网上搜索,它显示相同的语法.
谢谢.
我使用下面的代码:
char filename[ 255 ];
strncpy( filename, getenv( "HOME" ), 235 );
strncat( filename, "/.config/stationlist.xml", 255 );
Run Code Online (Sandbox Code Playgroud)
收到此消息:
(warning) Dangerous usage of strncat - 3rd parameter is the maximum number of characters to append.
(error) Dangerous usage of 'filename' (strncpy doesn't always null-terminate it).
Run Code Online (Sandbox Code Playgroud) cppcheck 新手。无法弄清楚如何解决此问题(cppcheck 警告)。任何帮助,将不胜感激。
if (!call_initialized)
{ char id1[16];
char id1[16];
char* dummy_char_ptr = inet_ntoa(*((in_addr*)&source_ip));
std::strncpy(id1, dummy_char_ptr, 16);
dummy_char_ptr=inet_ntoa(*((in_addr*)&destination_ip));
std::strncpy(id2, dummy_char_ptr, 16);
dummy_char_ptr=NULL;
std::cerr << id1 << " -----> " << id2 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误(警告) - 调用 strncpy() 后,缓冲区“id2”可能不会以零结尾。
#include <iostream>
using namespace std
#include <string.h>
int main(){
char token[] = "some random string";
char c[23];
strcpy( c, token);
strncpy(c, token, 5);
c[strlen(c)] = '\0';
cout<<c;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
我的输出是:some random string.但我希望它是:some.任何人都可以解释为什么它的行为像这样?
我有问题编译以下行:
/*This code compiles with error*/
char HeLev1[6];
HeLev1[]="45.0";
/*but this is OK:*/
char HeLev1[6]="45.0";
Run Code Online (Sandbox Code Playgroud)