Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 标签只能用作语句错误的一部分_C_Unix_Label_Labeled Statements - Fatal编程技术网

C 标签只能用作语句错误的一部分

C 标签只能用作语句错误的一部分,c,unix,label,labeled-statements,C,Unix,Label,Labeled Statements,我一直在浏览论坛,但我没有找到一个适合我情况的答案。我试图使用'sort'(unix)进行系统调用,但是,我收到一个错误,它说:“标签只能是语句的一部分,声明不是语句。”下面是导致错误的代码 int processid; switch(processid = fork()){ //establishing switch statement for forking of processes. case -1: perror("fork()");

我一直在浏览论坛,但我没有找到一个适合我情况的答案。我试图使用'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.");
}
在系统调用中,我试图按字母顺序对文件进行排序,以便按名称简单地收集类似的术语

当错误发生在包含execv系统调用命令的char*const时,我真是目瞪口呆。此精确的switch语句适用于不同的程序文件。有人能发现我错过了什么吗? 感谢

在C中(与C++相反),声明不是语句。标签只能位于语句之前。例如,您可以编写在标签后插入null语句

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;
    }

考虑到在第一种情况下,变量的范围是switch语句,而在第二种情况下,变量的范围是标签下的内部代码块。变量具有自动存储持续时间。因此,在退出相应的代码块后,它将不活动。

在标签下定义变量时,应告知变量的范围(使用大括号)


因此,这只是在我的案例冒号之后添加另一个分号的案例。你能解释一下为什么这是Vlad吗?@Bolognesebindit一个分号引入了一个空语句。我错了,这是正确的。每天学习新的东西。投票吧!对于每个
案例
(不考虑C或C++),总是使用复合语句
{}
,这是一种很好的做法。因为这使得分配到那里的任何变量都是局部的
案例
,而不是整个
开关
@Lundin,只要有声明。通常没有。开关不应该有太多的代码。如果需要,将其移动到函数
sort
是正常程序,而不是系统调用。声明是一个没有块的
开关
语句无论如何都是一个非常糟糕的主意。一本好的C语言书可以解释为什么。旁注:是否有任何理由使数组
常量
,但不是它们指向的对象?不能更改字符串文字。你在哪里执行这个程序?提供一个答案。问题的哪一部分是特定于Unix的?如果没有,那么请不要用不相关的标签发送垃圾邮件。错误消息让你绊倒的是什么?写得很清楚。
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.");
}