C语言中怎样最好地从标准输入流中获取字符串?请教:linux c strcat 拼接多次字符串就崩溃

时间:2018-01-28 10:56:02   浏览:次   点击:次   作者:   来源:   立即下载

有哪些方式可能很好地实现、并避开内存泄露问题?

比如可以写:

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

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息