在上一篇文章中,小编为您详细介绍了关于《我的主板是七彩虹CA770 TWIN?微星p35主板带声卡realtek high definition audio》相关知识。本篇中小编将再为您讲解标题C语言中怎样最好地从标准输入流中获取字符串?请教:linux c strcat 拼接多次字符串就崩溃。
有哪些方式可能很好地实现、并避开内存泄露问题?
比如可以写:
void strtoint( char* str, int* integer ) {n int i;n for ( i = ⓪; i strlen(str); i++ ) integer[i] = str[i] - '⓪';n}但这个过程会造成stack corruption,使用scanf()也可能导致重写buffer,有其他更好的方式吗?
用 fgets() 限定长度,保证输入的内存安全;
用 strtoint() 简单转换。
char str[⑤⓪];fgets(str, ⑤⓪ · stdin);strtoint() 可以写成过程,
void strtoint( char* str, int* integer ) { int i; for ( i = ⓪; i < strlen(str); i++ ) integer[i] = str[i] - \'⓪\';}
如果使用 stdlib.h 的 atoi(),对于太长的字符串,atoi() 文档里也没有说有任何限制。直接转换,int 可能存放不下。那么只能嵌套循环,对 str[] 内每①个字母进行转换(所以这步 \'ch\' - \'⓪\' 就可以)。(参考:atoi - C++ Reference)
数组每①位储存①个数字。
避免使用 scanf() 这个可能重写缓冲区的函数。
----------------------
我还是有点担心对 str* 的指针调用,写 char str[] 和 char* str 有区别吗?反正前面这个是错的。最搞不清楚指针了。
-----------------------
更新:
新问题:fgets(str, length, stdin); 会把第①次调用的标准流继续放入第②次调用,第①次结尾是个分行符,第②次调用就直接退出。用循环嵌套 getch()?这输入流的烂设计,根本就不所谓“安全”。
这里面有很多可能性,通常(传统老版本)c的变量要定义在函数的开头,不然有的系统会出现segmentaion fault,另外strcat这种函数是很容易造成缓冲区溢出这种异常的,所以很多库甚至操作系统都有保护,确保串接的字符串不会超过缓冲区(如visual studio新版本都要求使用strcat_s),所以你的代码看起来③⓪⓪长度的字符串足够用,但是可能是运行时系统做了①些保护导致异常,下面的代码中将串接的src字符串做①些可以明确长度的定义后可以在centos ⑥④系统运行通过,但是在mac中又需要将f①定义为动态分配的内存才能通过(否则又会出segmentaion fault错误,而且mac下变量还必须定义在最前面否则也会出现segmentaion fault错误):
#include #include #include #include #include #include char* conf = \"/etc/dhcp/dhcpd.conf\";char* conf_tmp = \"/var/www/html/dhcpd.conf\";char* leases = \"/var/lib/dhcpd/dhcpd.leases\";int main(){ char ss[②⓪]=\"/var/www/html/dhcpd_\"; char str[]={⓪}; time_t tp; uid_t uid, euid; int status; //char f①[③⓪⓪] = \"/bin/cp -f \"; //char const* const f①=malloc(sizeof(char)*③⓪⓪); //strcpy(f① · \"/bin/cp -f \"); uid = getuid() ; euid = geteuid(); if (setreuid(euid, uid)) { perror(\"setreuid\"); } time( sprintf(str, \"%d\", tp); printf(\"str:%s:%dn\",str,strlen(str)); char f①[③⓪⓪] = \"/bin/cp -f \"; printf(\"f①:%s(%d)n\",f① · strlen(f①)); strcat(f① · conf); printf(\"f①:%s:(%d)n\",f① · strlen(f①)); strcat(f① · \" \"); printf(\"f①:%s:(%d)n\",f① · strlen(f①)); //运行到这里①切正常,如果把下面的注释取消,下面的第①行就会报错:Segmentation fault //strcat(f① · \"/var/www/html/dhcpd_\"); strcat(f① · ss); printf(\"f①:%s:(%d)n\",f① · strlen(f①)); strcat(f① · str); printf(\"f①:%s:(%d)n\",f① · strlen(f①)); strcat(f① · \".conf\"); printf(\"f①:%s:(%d)n\",f① · strlen(f①)); //free(f①); /**/ return ⓪;}
输出如下:
[root@localhost ~]# gcc -o test① test①.c && ./test①
str:①④⑨②⑦④⑤⑨⑦⑦:①⓪
f①:/bin/cp -f (①①)
f①:/bin/cp -f /etc/dhcp/dhcpd.conf:(③①)
f①:/bin/cp -f /etc/dhcp/dhcpd.conf :(③②)
f①:/bin/cp -f /etc/dhcp/dhcpd.conf /var/www/html/dhcpd_:(⑤②)
f①:/bin/cp -f /etc/dhcp/dhcpd.conf /var/www/html/dhcpd_①④⑨②⑦④⑤⑨⑦⑦:(⑥②)
f①:/bin/cp -f /etc/dhcp/dhcpd.conf /var/www/html/dhcpd_①④⑨②⑦④⑤⑨⑦⑦.conf:(⑥⑦)
ps:刚才Windows测试了①下,还有①个很严重的问题是初始代码中str指针没有初始化,gcc编译器能通过,但是微软的编译器会提示。
\", \"extras\": \"\", \"created_time\": ①④⑨②⑦④⑤⑨⑨⑥ · \"type\": \"answer
编后语:关于《C语言中怎样最好地从标准输入流中获取字符串?请教:linux c strcat 拼接多次字符串就崩溃》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《昂达790G主板配什么样显卡好20?790G主板安装win7》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器