2013-03-25 18 views
0

,有下面的代碼片段:gets()函數沒有得到excuted在我的源代碼

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 %d\n", 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 %x\n", 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 %x\n", 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_ack, send_rst函數使用原始套接字發送數據包。 似乎gets()函數沒有得到執行,這有什麼問題? 謝謝!

+0

有你'ack_seq'檢查後'得到()'? – 2013-03-25 10:36:32

+0

'gets()'後'amount'的值是多少? – Dipto 2013-03-25 10:38:07

+0

我修改了源代碼並輸出了 – user1944267 2013-03-25 10:42:08

回答

1

撥打gets之前致電getchar();。就目前而言,您輸入了兩個字符,即命令號和換行符。所以gets讀取一個空白行,去掉換行符,並在你的數組中存儲一個空字符串。

正如在其他答案中指出的,gets由於其安全風險已被棄用,但這與您的問題無關。

1

嘗試檢查返回值。如果在嘗試讀取字符時遇到文件結尾,則會設置eof指示符(feof)。如果在任何字符被讀取之前發生這種情況,則返回的指針是空指針

兼容性 C標準(2011)的最新版本已將其明確地從其規範中刪除。 該功能在C++中已棄用(截至2011標準,遵循C99 + TC3)。

+0

你能不能更清楚一點?我不明白 – user1944267 2013-03-25 10:43:22

+0

請嘗試檢查得到的返回值.. – hazzelnuttie 2013-03-25 10:44:16

0

永遠永遠永遠永遠永遠永遠NEVER使用gets

首先,它是標準庫作爲2011年版標準中不再(已在1999年的版本被棄用) 。其次,它(不可能,)在您的代碼中引入一個故障點/主要安全漏洞。自從晚於1980s以來它一直是受歡迎的惡意軟件利用。由一個圖書館功能造成的混亂比打破40年遺留代碼的前景更加可怕,這就是爲什麼WG14兩年前最終將其從語言定義中刪除的原因。 這就是它有多邪惡。

使用fgets代替:

fgets(data, sizeof data, stdin); 

fgets將存儲最多sizeof data - 1(在這種情況下,99)字符到目標緩衝區,包括在有空間的末尾換行符。

您的問題getchar調用循環條件不會消耗輸入後的換行符。當你輸入一個命令時,你輸入1 <Enter>,所以輸入流包含字符{'1', '\n'}。輸入流中留下的換行符號表示後面的gets調用結束,因此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; 
     ... 
    } 
}