C 获取错误“;未定义对'的引用;STREP&x27&引用;叮当作响

C 获取错误“;未定义对'的引用;STREP&x27&引用;叮当作响,c,clang,mingw,codeblocks,strsep,C,Clang,Mingw,Codeblocks,Strsep,以下是相关代码: 定义GNU源 #定义缓冲区大小1024 #包括 #包括 #包括 内部主(空){ 而(1){ 字符*缓冲区; 尺寸=32; 尺寸线; line=getline(&buffer,&size,stdin); printf(“%s\n”,缓冲区); int命令列表[行]; 整数计数=0; while(strep(buffer,“”){ commandList[count]=strep(缓冲区“”); 计数++; } } } 我使用minGW和Clang的代码块 我知道我的一些代码并没

以下是相关代码:

定义GNU源
#定义缓冲区大小1024
#包括
#包括
#包括
内部主(空){
而(1){
字符*缓冲区;
尺寸=32;
尺寸线;
line=getline(&buffer,&size,stdin);
printf(“%s\n”,缓冲区);
int命令列表[行];
整数计数=0;
while(strep(buffer,“”){
commandList[count]=strep(缓冲区“”);
计数++;
}
}
}
我使用minGW和Clang的代码块


我知道我的一些代码并没有做到它目前应该做的,但我非常确定它至少应该编译。我还收到一条警告:“隐式声明函数'strep'。

源文件应包含string.h:

 #include <string.h>
#包括
不确定这是否会修复链接错误(未定义的引用),但可能会

根据我的Linux手册,它可能需要:

 #define _DEFAULT_SOURCE
    (...)
 #include <string.h>
\define\u DEFAULT\u源
(...)
#包括

\define\u BSD\u源
(...)
#包括

如果所有其他方法都失败,请使用
strtok()
,也可以从
string.h
中选择,这在许多方面都是优越的。Strtok()不修改第一个参数;处理
const
字符串;而且它不会覆盖分隔符。

strep本身实现起来很简单

#include <string.h>

char *strsep(char **stringp, const char *delim) {
    char *rv = *stringp;
    if (rv) {
        *stringp += strcspn(*stringp, delim);
        if (**stringp)
            *(*stringp)++ = '\0';
        else
            *stringp = 0; }
    return rv;
}
#包括
char*strep(char**stringp,const char*delim){
char*rv=*stringp;
如果(rv){
*stringp+=strcspn(*stringp,delim);
如果(**stringp)
*(*stringp)+='\0';
其他的
*stringp=0;}
返回rv;
}

我刚刚添加了这两个#define语句,但不幸的是它没有起作用。它无法修复链接错误。通常,头文件不会这样做。@JL2210:当然。然而,
strep
很容易用strtok或strstr定义,或者用附加逻辑,用其他
string.h
函数定义是。可以使用
strtok()
,但是…
strtok()
会像
strep()
一样修改它的第一个参数
strtok()
不能在并发循环中使用(例如,用一个分隔符解析一个大字符串(例如,
以分离类似路径的环境变量的组件),然后用另一个分隔符分析找到的令牌(例如,
/
以分离目录组件))。另外,根据设计,
strtok()
将多个相邻分隔符视为单个分隔符,而
strep()
将相邻分隔符视为围绕空字段。在Windows上使用
strtok_s()
或在POSIX上使用
strtok_r()
进行嵌套解析。
strep()
函数不可用,因此它可能在Windows/MinGW/Clang环境中不可用。(MinGW是“Windows的最小GNU”-它不包括所有内容。)。您可能可以使用
\u stresp()
——更可能的情况是,您需要找到它的代码并自己实现,或者使用不同的函数。您正在将
字符*
传递给
stresp
。第一个参数应该是
char**
。尝试传入
缓冲区
,而不仅仅是
缓冲区
。如果放弃MinGW,您可能想尝试cygwin的gcc实现。我知道它有
strep
#include <string.h>

char *strsep(char **stringp, const char *delim) {
    char *rv = *stringp;
    if (rv) {
        *stringp += strcspn(*stringp, delim);
        if (**stringp)
            *(*stringp)++ = '\0';
        else
            *stringp = 0; }
    return rv;
}