2014-02-28 67 views
0

我正在嘗試創建一個簡單的程序,用作爲命令參數輸入的文件位置上的system()調用cat。但是,每次我調用文件時,我都會遇到分段錯誤(核心轉儲)。你能檢查一下爲什麼(我在程序中看不到任何東西,我正在做一些有關內存的事情來得到這個錯誤!)。在一個簡單的命令行程序中的段錯誤

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    if(argc != 2) 
    { 
     printf("usage: %s filename", argv[0]); 
    } 
    else 
    { 
     printf("commad: %s", strcat("cat ", argv[1])); 
     system(strcat("cat ", argv[1])); 
    } 
    return 0; 
} 
+1

修改字符串文字是未定義的行爲。 – hmjd

+0

您能否請您解釋 – MedAli

+0

@MohamedAliJamaoui您需要爲strcat –

回答

3

您不能修改字符串常量,比如"cat "加載時,你的可執行文件,他們通常都存儲在只讀內存中的段,而當你嘗試修改它,你會得到你要求解釋的分段錯誤。

使用std::string代替考慮,它是更慣用的C++方法:

#include <stdlib.h> 
#include <stdio.h> 

#include <string> 

int main(int argc, char *argv[]) {  
    if(argc != 2) { 
     printf("usage: %s filename", argv[0]); 
     return 0; 
    } else { 
     std::string command("cat "); 
     command += argv[1]; 
     printf("command: %s", command.c_str()); 
     return system(command.c_str()); 
    } 
} 

std::string對象將動態分配必要的存儲器以容納附加的字符添加到它。但是,如果您希望繼續使用C字符串,則需要明確地管理字符緩衝區:

char *buffer = static_cast<char*>(malloc(5 + strlen(argv[1]))); 
strcpy(buffer, "cat "); 
strcat(buffer, argv[1]); 
printf("command: %s", buffer); 
// ... 
free(buffer); 
2

在您的strcat調用中,您嘗試修改未定義行爲的字符串文字「cat」。 strcat的第一個參數應該是可以寫入的緩衝區,而不是字符串文字。

2

您正在使用strcat不正確。您需要提供目標緩衝區。

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
     if(argc == 2) { 
      char[20] c = "cat"; 
      strcat(c, argv[1]); 
      printf("commad: %s", c); 
      system(c); 
     } 
     else { 
      printf("usage: %s filename", argv[0]); 
     } 

     return 0; 
} 

或者不串聯

printf("commad: %s%s", "cat ", argv[1]); 
+0

+1提供目標緩衝區,以便發現您的錯誤 –

相關問題