Python破坏了我,并试图将我的思想包裹在C现在正是一场愚蠢错误的大屠杀。这是我无法理解的。
我希望C等价于Python的os.path.split
,但没有确切的等价物。 strsep
看起来很相似,但需要一些按摩才能使用。
首先,我定义了我的路径类型:给定长度的字符串。
#define MAX_PATH_LEN 200 /* sigh */
typedef char t_path[MAX_PATH_LEN];
然后我写了一些代码来做实际的按摩,试图避免副作用 - 只是为了让事情变得简单。
typedef struct {
t_path next;
t_path remainder;
} t_path_next
t_path_next path_walk_into(t_path path) {
t_path_next output;
t_path my_next, my_remainder = "/";
strncpy(my_next, path, MAX_PATH_LEN);
strsep(&my_next, my_remainder);
output.remainder = my_remainder;
output.next = my_next;
return output;
}
然而,gcc并没有留下深刻的印象。
badp@delta:~/blah$ gcc path.c -Wall
path.c: In function ‘path_walk_into’:
path.c:39: warning: passing argument 1 of ‘strsep’ from incompatible pointer type
/usr/include/string.h:559: note: expected ‘char ** __restrict__’ but argument is of type ‘char (*)[200]’
path.c:41: error: incompatible types when assigning to type ‘t_path’ from type ‘char *’
path.c:42: error: incompatible types when assigning to type ‘t_path’ from type ‘char *’
我对这张纸条感到困惑 - char **
和char (*)[200]
如何真正不同 - 但错误甚至更奇怪。我想在t_path
类型的字段中分配一个我声明为t_path
的变量,但我没有。
为什么?
对于任何感兴趣的人来说,这是函数的正确工作版本:
t_path_next path_walk_into(t_path path) {
t_path_next output;
t_path my_path, delim = "/";
char* my_path_ptr = my_path;
strncpy(my_path, path, MAX_PATH_LEN);
strsep(&my_path_ptr, delim); //put a \0 on next slash and advance pointer there.
if (my_path_ptr == NULL) //no more slashes.
output.remainder[0] = 0;
else
strncpy(output.remainder, my_path_ptr, MAX_PATH_LEN);
strncpy(output.next, my_path, MAX_PATH_LEN);
return output;
}
答案 0 :(得分:4)
错误:您不能直接在C中分配数组,例如字符串。您需要通过char复制char,或者调用str(n)cpy,它会为您完成。
答案 1 :(得分:3)
对于警告:您可能已经意识到数组可能会衰减到指针。也就是说,例如,是什么使得数组可以作为预期指针的函数的参数。在你的情况下,你拥有的是一个指向数组的指针:没有理由将这样的东西转换为指向指针的指针。
为了记录,C99标准说(6.3.2.1/3):
除非是sizeof运算符或一元&运算符的操作数。运营商,或者是 用于初始化数组的字符串文字,具有类型''数组类型'的表达式 转换为类型为''指向类型'的指针的表达式,指向的初始元素 数组对象并不是左值。
你在一元&
的背景下:不为你转换。
对于错误:它已经被回答,但是不能直接进行数组赋值。您可能希望使用strcpy
或strncpy
。