c - 带有一个输入的 strcmp 的分段错误
问题描述
我对以下代码有疑问。
我有一个全局变量
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, " \0\r\n");
//printf("%d\n", index);
index = index + 1;
}
}
我发现如果我输入exit
标准输入会出现分段错误,但如果输入cd ..
标准输入则不会。为什么会这样?
解决方案
我们不知道cd()
函数的定义是什么,但是您可能希望在这个程序中考虑一些事情。
首先,我认为动态分配 80 字节的内存给input
缓冲区没有任何好处,因为您可以轻松地在堆栈上自动执行char input[80];
此操作 - 这是免费且简单的,完成后不需要解除分配。
如果你这样做,你会导出大小fgets(input, sizeof input, stdin)
,如果你将输入行的大小从 80 更改为其他数字,你只需更改一次:sizeof
数组上的直接拉取大小。
你的parse()
日常生活也需要一点帮助。如图所示,通过 声明函数是一个非常好的主意,extern
这样当编译器看到您在循环中调用函数时(就在 之后fgets
),它知道参数和返回类型。否则它必须做出假设。
因为parse()
将您从输入中读取的行分开,所以不需要将字符串复制到其他地方,因此您可以tokens
从多维数组转换为简单的指针数组。当您运行strtok()
分割参数的行时,您可以只存储指针,知道它们将指向稳定的数据,直到下一个fgets()
。
另外:您的代码并不严格要求或使用它,但添加NULL
指向tokens
列表末尾的指针是一个非常好的主意:否则,调用者如何知道实际输入了多少参数?此代码检查用户是否只输入了一个空行。
我们还稍微改变了循环,因此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;
}
推荐阅读
- tensorflow - 用于可视化潜在空间图像的 TensorFlow 嵌入投影仪不起作用?
- javascript - 如何:Onclick 按钮和文本区域脚本
- postgresql - 如何使用 postgresql 为数据仓库星型模式制作简单的日维度表?
- android - setTimeout 和 setInterval 未在 webview 中执行
- python - 以 root 身份运行 subprocess.run 不起作用
- c# - Unity 投影仪着色器更改主颜色
- python - scikit-learn 逻辑回归预测与自我实现不同
- python - 为什么这个 Python 语法错误不是错误?
- r - 如何避免气泡图中的气泡重叠?
- python - 写入 csv 时从数据框中删除双引号