c/c++语言开发共享gets()不会被解雇

在我的源代码中,有以下代码段:

while ((cmd=getchar()) != EOF) { switch(cmd) { case '1': printf("pls input the data to be sent: n"); char data[100]; gets(data); send_data(sd_cli, data, strlen(data), &svr_addr); pcap_packet = pcap_next(pcap_handler, &pcap_header); if(pcap_packet !=NULL) printf("capture one packet with length of %dn", pcap_header.len); analyze_pcap_pkt(pcap_packet, &ipid, &temp_port1, &temp_port2, &seq, &ack_seq); temp_seq = seq; seq = ack_seq; ack_seq = temp_seq; ipid++; break; case '2': printf("old ack is %xn", ack_seq); printf("pls input the seq plus amount: n"); char amount[6]; gets(amount); ack_seq= ack_seq+atoi(amount); printf("new akc is %xn", ack_seq); send_ack(sd_raw, &svr_addr, lo_ipaddr, svr_ipaddr, htons(src_port), htons(dst_port), htons(ipid), htonl(seq), htonl(ack_seq)); ipid++; break; case '4': send_rst(sd_raw, &svr_addr, lo_ipaddr, svr_ipaddr, htons(ipid), htons(src_port), htons(dst_port), htonl(seq), htonl(ack_seq)); break; } } 

当我运行程序时,输出是:

 old ack_seq is ab2429c6 pls input the seq plus amount: new ack_seq is ab2429c6 sendto ack packet 

: 无效的论点

BTW: send_acksend_rst函数使用raw socket发送数据包。 看来gets()函数没有得到解决,这有什么问题? 谢谢!

    调用getchar(); 在你打电话之前。 按原样,您输入两个字符,命令编号和换行符。 因此, gets空白行,剥离换行符,并在数组中存储空字符串。

    如其他答案所述,由于存在安全风险,因此不推荐使用gets ,但这与您的问题无关。

    尝试检查返回值。如果在尝试读取字符时遇到文件结尾,则设置eof指示符(feof)。 如果在读取任何字符之前发生这种情况,则返回的指针是空指针

    兼容性C标准(2011)的最新版本明确地将此function从其规范中删除。 该函数在C ++中已弃用(截至2011年标准,遵循C99 + TC3)。

    永远不会永远不会永远不会使用

    首先,它不再是2011版标准的标准库的一部分(已在1999版本中弃用)。 其次,它将(不会, 将会 )在您的代码中引入一个失败点/主要安全漏洞。 自20 世纪80年代后期以来,它一直是受欢迎的恶意软件攻击。 由一个库函数引起的混乱比破坏40年遗留代码的前景更可怕,这就是为什么WG14最终在两年前将其从语言定义中删除了。 那是多么邪恶。

    改为使用fgets

     fgets( data, sizeof data, stdin ); 

    fgets将存储最多 sizeof data - 1 (在本例中为99)个字符到目标缓冲区,包括尾随换行符(如果有空间)。

    您的问题是循环条件中的getchar调用不会消耗输入后的换行符。 输入命令时,键入1 ,因此输入流包含字符{'1', 'n'} 。 在输入流中留下的换行信号表示下一行的结束调用,因此data基本上是空的。 公平地说,这也是fgets一个问题; 你可能真的想在这个例子中使用scanf

     if ( scanf( " %99[^n]", data ) == 1 ) { ... } 

    格式字符串中的前导空格告诉scanf跳过任何前导空格(例如从前一个scanfgetchar调用留下的换行符)并从第一个非空白字符开始读取。 %99[^n]转换说明符告诉scanf最多可读取99个字符,或直到它看到换行符(或EOF)。

    同样,您可能希望使用scanf来读取命令代码,因此您可以忽略任何杂散换行符:

     while ( scanf( " %c", &cmd ) == 1 ) // again, blank before %c causes any leading { // whitespace to be skipped switch( cmd ) { case '1': char data[100]; if ( scanf( " %99[^n]", data ) == 1 ) { send_data( ... ); ... } else { // handle input error } break; ... } } 

      以上就是c/c++开发分享gets()不会被解雇相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/522217.html

      (0)
      上一篇 2020年12月9日
      下一篇 2020年12月9日

      精彩推荐