段错误:使用strtok,系统调用。 C编程
Segmentation fault: Using strtok, system calls. C programming
我目前正在尝试 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
strcpy(storage[0],token);
printf("%s\n",storage[0]);
你有 4 到 5 次这样做。您需要检查 token
是否不为 NULL。否则你的程序就是 UB
if( token)
{
strcpy(storage[0],token);
printf("%s\n",storage[0]);
}
else
{
/* do something if token is NULL */
}
您还可以重新组织循环(以第一个为例):
token = strtok(content, a);
i = 0;
while(token != NULL)
{
strcpy(storage[i],token);
printf("%s\n",storage[i++]);
token = strtok(NULL, a);
}
当您的程序试图访问超出分配给您的程序的内存区域时,就会发生段错误。由于您只分配了大小为 20 的数组用于存储和存储更多,这是一个问题。此外,您还分配了大小为 20 的数组用于每行存储令牌,这可能不够,具体取决于您每行拥有的令牌数量。除了这些,就像其他人提到的一样,您还需要检查 strtok 是否返回 null。尝试取消引用空指针也会导致分段错误
我目前正在尝试 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
strcpy(storage[0],token); printf("%s\n",storage[0]);
你有 4 到 5 次这样做。您需要检查 token
是否不为 NULL。否则你的程序就是 UB
if( token)
{
strcpy(storage[0],token);
printf("%s\n",storage[0]);
}
else
{
/* do something if token is NULL */
}
您还可以重新组织循环(以第一个为例):
token = strtok(content, a);
i = 0;
while(token != NULL)
{
strcpy(storage[i],token);
printf("%s\n",storage[i++]);
token = strtok(NULL, a);
}
当您的程序试图访问超出分配给您的程序的内存区域时,就会发生段错误。由于您只分配了大小为 20 的数组用于存储和存储更多,这是一个问题。此外,您还分配了大小为 20 的数组用于每行存储令牌,这可能不够,具体取决于您每行拥有的令牌数量。除了这些,就像其他人提到的一样,您还需要检查 strtok 是否返回 null。尝试取消引用空指针也会导致分段错误