2013-01-21 41 views
1
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#include<stdbool.h> 
char output[17]={0}; 
const char* change_mac(char ch[100]) 
{ 
    int i = 0; 
    int k = 0; 

    bool flag = false; 
    while(i < strlen(ch)) 
    { 
     flag = false; 
     int j = 0; 
     while (j < 2) 
     { 
      if(ch[i] == ':' || strlen(ch) == i) 
      { 
       if(k != 0) 
       { 
        char temp = output[k-1]; 
        output[k-1] = '0'; 
        output[k] = temp; 
       } 
       flag = true; 
      } 
      else 
      { 
       output[k] = ch[i]; 
      } 
      i++; 
      j++; 
      k++; 
     } 
     if(i < strlen(ch) && memchr(ch, ':', strlen(ch))) 
     { 
      output[k] = ':'; 
      output[k+1] = '\0'; 
     } 
     else{ 
      output[k] = ch[i]; 
     } 
     k++; 
     if(!flag) 
     { 
      i++; 
     } 
    } 

    output[k-1] = 0; 
    return output; 
} 



int main(int argc,char **argv) 
{ 
char name[]=""; 
char ch[100] = "0:0:0:0:0:0"; 

if(sscanf(argv[1],"%s",ch) == 1) 
{ 
    name=change_mac(ch); 
} 
return 0; 
} 

/我想獲得MAC爲CMD行認爲把它變成正確的格式,並在存儲這個「名」變量,這樣我可以用它進一步這裏它顯示了一些類型轉換錯誤/字符串在C:給一些邏輯錯誤

/*執行:./a.out 0:C:F4:DR:4R:1 */

+0

你必須在'ch []'中檢查':'if in,if if(i!= sizeof(ch)){output [k] =':'; }'對於第二個 –

+1

在C中沒有try/catch結構,但是在C++中。我不會建議使用它,除了嚴重失敗之外,因爲它非常昂貴。 –

+0

AndreasGrapentin說真的..如果你想實現try-catch一段時間,這個鏈接將是有用的[我如何用C中的消息的可嵌套try-catch-finally語句實現異常(http://stackoverflow.com/問題/ 1779189/how-do-i-implement-exceptions-with-nestable-try-catch-finally-statement-with-mes)和http://www.nicemice.net/cexcept/ –

回答

1

你已經改變了你在錯誤的方式:(問

我有如下更正代碼:

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
int main() 
{ 
    //char ch[] = {'0',':','1','0',':','1',':','C',':','B','F',':','9','8'}; 
    char ch[] = {'a','b','c','d','e','f','g','f'}; 
    char output[20]={0}; 
    int i = 0; 
    int k = 0; 
    bool flag = false; 

    while(i < sizeof(ch)) 
    { 
     flag = false; 
     int j = 0; 
     while (j < 2) 
     { 
      if(ch[i] == ':') 
      { 
       if(k != 0) 
       { 
        char temp = output[k-1]; 
        output[k-1] = '0'; 
        output[k] = temp; 
       } 
       flag = true; 
      } 
      else 
      { 
       output[k] = ch[i]; 
      } 
      i++; 
      j++; 
      k++; 
     } 
     if(i !=sizeof(ch) && memchr(ch, ':', sizeof(ch))) 
     { 
      output[k] = ':'; 
      output[k+1] = '\0'; 
     } 
     else{ // added this else in your code 
      output[k] = ch[i]; 
     } 
     k++; 
     if(!flag) 
     { 
      i++; 
     } 
    } 
    output[k-1] = 0; // added this 
    printf("%s\n",output); 
    printf("%d\n",sizeof(ch)); 
    printf("%d\n",sizeof(output)); 

    return 0; 
} 

它的工作好!

案例1如果char ch[] = {'a','b','c','d','e','f','g'};

~$ ./a.out 
abcdefg 
8 
20 

案例2如果char ch[] = {'0',':','9',':','1',':','C',':','B',':','9','8'};

:~$ ./a.out 
00:10:01:0C:BF:98 
14 
20 

雖然不好給代碼,但因爲你,因爲早上想我有給定

+0

;並輸出abcdefg !!!!不正確(最後一個字符是缺少))其實很好..我的上述代碼也正在工作...現在我正在研究一種方法,我想通過它在main()中的命令行參數上傳遞它,函數並返回格式化的值。 –

+0

output [k-1] = 0;那麼它打印好..我認爲.. –

+0

@ user95711是的,你是正確的...請再次檢查這個答案我做了一些更改..這將工作,我希望.. –

4

你忘了在output[]末尾添加'\0'printf("%s\n",output);之前添加以下代碼:

output[k-1] = '\0';  

接下來,
我不是太肯定,但對於第二個功能改變你,如果下面的代碼:

if(i !=sizeof(ch)) 
{ 
    output[k] = ':'; 
} 

到以下(添加':'只有當它的存在於ch[]

if(i !=sizeof(ch) && memchr(ch, ':', sizeof(ch))) 
{ 
    output[k] = ':'; 
} 
else{ 
    output[k] = ch[i]; 
} 

並且包括頭文件string.h

試試吧!並讓我知道你是否有其他疑問。

但是,是它不是像你想「嘗試,趕上或錯誤處理,如」

編輯
正如你在我的答案評論我修理你的錯誤:printf("%s\n",output);
添加以下代碼

output[k-1] = 0; 
if(memchr(ch, ':', sizeof(ch))==NULL){ 
     output[k-2] = 0; 
} 

陽離子:它不是好辦法解決這樣的錯誤,建議你重寫你的代碼

+0

第一個正在工作,但第二個一個不..它返回一些垃圾值! –

+0

@ user95711我已經改變了我的代碼(答案)爲第二,我也檢查過我的系統..它的工作!..請再次審查,不要忘記添加'#include ' –

+0

輸入:abcdefg,輸出: abadeag !!!預計:abcdefg –

0

你已經改變了你的問題太多時間:

您的代碼路過參數:

此代碼
#include<stdio.h> 
#include <string.h> 
#include<stdlib.h> 
void function(char* ch); 
int main(int argc, char* argv[]){ 
    if(argc!=2){ 
     printf("\n wrong number arguments!\n"); 
     exit(0); 
    } 
    function(argv[1]); 
    return 0; 
} 
void function(char* ch){ 
    char output[20]={0}; 

    int i = 0; 
    int k = 0; 
    bool flag = false; 

    while(i < strlen(ch)) 
    { 

     flag = false; 
     int j = 0; 

     while (j < 2) 
     { 
      if(ch[i] == ':') 
      { 
       if(k != 0) 
       { 
        char temp = output[k-1]; 
        output[k-1] = '0'; 
        output[k] = temp; 
       } 
       flag = true; 
      } 
      else 
      { 
       output[k] = ch[i]; 
      } 
      i++; 
      j++; 
      k++; 
     } 

     if(i !=strlen(ch) && memchr(ch, ':', strlen(ch))) 
     { 
      output[k] = ':'; 
      output[k+1] = '\0'; 

     } 
     else{ 
      output[k] = ch[i]; 
     } 
     k++; 

     if(!flag) 
     { 
      i++; 
     } 
    } 
    output[k] = 0; 

    /*for (i=0;i<sizeof(output);i++) 
    { 
     printf("%c", output[i]); 
    }*/ 

    printf("%s\n",output); 
} 

運行:

案例1

~$ ./a.out abcderf 
abcderf 

情況-2

:~$ ./a.out 0:9:1:C:B:98 
00:09:01:0C:0B:98 
+0

我想將返回值存儲在char name [] =「」;像變量...,我想進一步使用!它給了我一些不完整的指針類型..就像明智的..你可以檢查這個代碼中的重大錯誤 –

+0

'(sscanf(argv [1],「%s」,ch)'在您的代碼中出錯 –

+0

@ user95711嘗試瞭解此代碼並學習sscanf,全局變量和局部變量的語法...... –