分段错误:使用strtok,系统调用。 C程序设计

时间:2019-02-02 08:15:13

标签: c segmentation-fault system system-calls strtok

我目前正在尝试两次strtok以便标记文件传递的所有命令。第一轮令牌化工作正常,但随后出现分段错误。还有什么比这可能是什么?我试图使所有数组变小,因为我认为这是内存问题。这也是用C语言编写的,我没有收到任何错误或警告。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *argv[])
{
        char content[100];
        int fd;
        ssize_t bytes = 0;
        fd = open(argv[1], O_RDONLY);
        int i = 0;

        char* token;
        const char a[2] = "\n";
        const char b[2] = " ";
        char storage[20][20];
        char temp[20][20];
        bytes = read(fd, content, sizeof(content)-1);
        close(fd);

        if(fd < 0)
        {
                write(1, "File doesn't exist\n", 19);
                return 1;
        }


        token = strtok(content, a);
        strcpy(storage[0],token);
        printf("%s\n",storage[0]);

        while(token != NULL)
        {
        i++;
        token = strtok(NULL, a);
        strcpy(storage[i],token);
        printf("%s\n",storage[i]);
        }

      token = strtok(storage[0],b);
        strcpy(temp[0], token);
        printf("%s\n",temp[0]);
        i = 0;

        while(token != NULL)
        {
        i++;
        token = strtok(NULL, b);
        strcpy(temp[i],token);
        printf("%s\n",temp[i]);

        }





return 0;

}

这是我得到的输出:

/bin/ls -l 
/bin/cat command.txt 
/usr/bin/wc -l -w command.txt 
??
Segmentation fault

2 个答案:

答案 0 :(得分:1)

//Set the object, also you can use an array instead of an object
let obj = CustomDocument()
obj.name = "doc1"
obj.image = UIImage(named: "my_image")
if let archivedObject = archiveDocument(document: obj){
    UserDefaults.standard.set(archivedObject, forKey: "obj")
}

//Get the object
if let  archivedObject = UserDefaults.standard.data(forKey: "obj"){           
    obj = unarchiveDocument(unarchivedObject: archivedObject)
    let myImage = obj?.image
}

您有4或5次相同的操作。您需要检查 strcpy(storage[0],token); printf("%s\n",storage[0]); 是否不为NULL。否则,您的程序就是UB

token

您还可以重新组织循环(以第一个为例):

if( token)
{
    strcpy(storage[0],token);
    printf("%s\n",storage[0]);
}
else
{
    /* do something if token is NULL */
}

答案 1 :(得分:0)

当您的程序试图访问超出分配给您的程序的内存区域时,发生分段错误。既然你只分配的存储空间大小20和存储不止这些阵列,这是一个问题。另外,您还分配了大小为20的数组,用于每行存储令牌,这可能不足,具体取决于每行拥有的令牌数量。除了这些,像别人提到你还需要检查的strtok是返回null。尝试取消对空指针的引用也会导致分段错误