我有以下代码。目标是将读取行解析为标记,但具有处理单引号的附加功能。
char *line = readline(prompt);
char *token;
while (*line)
{
if (*line == '\'')
{
*line++;
while (*line != '\'')
*token++ = *line++;
*token = NULL;
printf("token is %s", token);
}
else if (*line == '\n' || *line == '\t' || *line == ' ')
{
while (*line != '\n' && *line != '\t' && *line != ' ')
*token++ = *line++
*token = NULL;
printf("token is %s", token);
}
}
我收到以下错误消息: “错误:无效的操作数到二进制*(有'int'和'char *') * token = NULL;“
我不完全确定为什么编译器会抱怨在我的令牌末尾分配'\ 0',但对* token ++ = * line ++赋值保持沉默。
非常感谢任何见解。
答案 0 :(得分:2)
以空值终止的C字符串以null character终止,这与null pointer不同。
宏25
65
0
表示空指针。没有内置宏来表示空字符,因此您应该使用字符文字NULL
:
'\0'
通过这种修正,该程序正在抛出一个分段错误,我的方法的逻辑是否存在明显的缺陷?
是的,*token = '\0';
指针未初始化。在初始化时为其分配内存
token
然后在char *token = malloc(strlen(line)+1);
循环结束后释放内存:
while
答案 1 :(得分:0)
NULL = (void *)0 //used with pointers to mean it points to nothing or the base address
而
'\0' is an ascii NUL //used as a string terminator which is a zeroed byte
所以你应该像
那样终止它*token = 0;
或
*token ='\0';