C语言 一个输入的 strrcmp 的分段错误



我在使用以下代码时遇到问题。

我有一个全局变量

char tokens[512][80];

连同代码:

int main(int argc, char** argv) {
char *input = malloc(sizeof(char) * 80);
while (1) {
printf("mini-shell>");
fgets(input, 80, stdin);
parse(input);
if (strcmp(tokens[0], "cd") == 0) {
cd();
}
else if (strcmp(tokens[0], "exit") == 0) {
exit(1);
}
}
}
void parse(char str[]) {
int index = 0;
char* str_ptr = strtok(str, " ");
while (str_ptr != NULL) {
strcpy(tokens[index], str_ptr);
str_ptr = strtok(NULL, " rn");
//printf("%dn", index);
index = index + 1;
}
}

我发现如果我为 stdin 输入exit会得到分割错误,但如果我为 stdin 输入cd ..,我不会。为什么会这样?

我们不知道cd()函数的定义是什么,但您可能希望在此程序中考虑许多事项。

首先,我不认为为input缓冲区动态分配 80 字节的内存有任何好处,因为您可以使用char input[80];轻松地在堆栈上自动分配 - 这是免费且简单的,并且不需要在完成后进行分配。

如果这样做,则可以使用fgets(input, sizeof input, stdin)导出大小,而如果将输入行的大小从 80 更改为其他数字,则只需更改一次:数组上的sizeof直接拉动大小。

您的parse()例行程序也需要一点帮助。如图所示,通过extern声明函数是一个非常好的主意,这样当编译器看到您在循环中调用函数时(紧接在fgets之后(,它知道参数和返回类型。否则,它必须做出假设。

由于parse()拆分了从输入中读取的行,因此不需要将字符串复制到其他位置,因此您可以将tokens从多维数组转换为简单的指针数组。当您strtok()运行该行以拆分参数时,您可以只存储指针,知道它们将指向稳定的数据,直到下一个fgets()

另外:您的代码并不严格要求或使用它,但是在tokens列表的末尾添加一个NULL指针是一个非常好的主意:否则,调用方如何知道实际输入了多少参数?此代码检查用户是否只输入了空行。

我们还稍微改变了循环,因此只调用一次而不是两次strtok(),包括注释中提到的n

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *tokens[512];
extern void parse(char *str);
int main(int argc, char** argv) {
char input[80];
while (1) {
printf("mini-shell> "); fflush(stdout); // make sure user sees prompt
fgets(input, sizeof input, stdin);
parse(input);
if (tokens[0] == NULL) continue; // user entered blank line
if (strcmp(tokens[0], "cd") == 0) {
cd();
}
else if (strcmp(tokens[0], "exit") == 0) {
exit(1);
}
}
}
void parse(char *str) {
int index = 0;
char* str_ptr;
while ( (str_ptr = strtok(str, " n")) != NULL)
{
tokens[index++] = str_ptr;
str = NULL; // for next strtok() loop
}
tokens[index] = NULL;
}

相关内容

  • 没有找到相关文章

最新更新