2017-09-21 21 views
3

我一直在尋找論壇,但我還沒有找到適用於我的情況的這個問題的答案。我正在嘗試使用'sort'(unix)進行系統調用,但是,我收到一個錯誤消息:「標籤只能是聲明的一部分,聲明不是聲明。」這是導致錯誤的代碼。標籤只能用作聲明的一部分錯誤

int processid; 
switch(processid = fork()){     //establishing switch statement for forking of processes. 
case -1: 
    perror("fork()"); 
    exit(EXIT_FAILURE); 
    break; 
case 0: 
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL}; //execv call to sort file for names. 
    break; 
default: 
    sleep(1); 
    printf("\nChild process has finished."); 
} 

在系統調用中,我試圖按字母順序對文件進行排序,以便按名稱簡單地收集文件。

我很傻,因爲這個錯誤發生在char * const包含我的execv系統調用的命令。這個EXACT switch語句適用於不同的程序文件。有人可以發現我缺少的東西嗎? 謝謝

+2

'sort'是一個正常的程序,而不是系統調用。無論如何,聲明是一個沒有阻塞的switch語句都是一個非常糟糕的主意。一本好的C書應該明確**爲什麼**。旁註:你使數組爲const的任何原因,但不是它們指向什麼?您不得更改字符串文字。你在哪裏執行該程序?提供[mcve]。 – Olaf

+0

問題的哪個部分是Unix特有的?如果沒有,請不要使用無關標籤發送垃圾郵件。 – Gerhardh

+0

什麼讓你對錯誤信息感到沮喪?它寫得很清楚。 –

回答

5

在C(與C++相反)聲明不是語句。標籤可能只在語句之前。你可以寫例如標籤

case 0: 
    ; 
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL}; //execv call to sort file for names. 
    break; 

之後插入一個空語句或者你可以括在大括號中的代碼

case 0: 
    { 
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL}; //execv call to sort file for names. 
    break; 
    } 

考慮到的是,在第一種情況中變量的作用域是開關語句,而在第二種情況下,變量的範圍是標籤下的內部代碼塊。該變量具有自動存儲持續時間。所以退出相應的代碼塊後它不會活着。

+0

所以這只是一個在我的結腸後添加另一個分號的例子。你能向我解釋爲什麼這是弗拉德? – BologneseBandit

+0

@BologneseBandit分號引入一個空語句。 –

+0

糟糕。我錯了,這是正確的。每天學些新東西。有一個upvote! – Bathsheba

0

當在一個標籤下面定義一個變量時,你應該告訴變量的範圍(使用大括號)。

int processid; 
switch(processid = fork()) 
{     //establishing switch statement for forking of processes. 
    case -1: 
     perror("fork()"); 
     exit(0); 
     break; 
    case 0: 
    { 
     char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL}; //execv call to sort file for names. 
     break; 
    } 
    default: 
     sleep(1); 
     printf("\nChild process has finished."); 
}