【发布时间】:2015-06-16 22:12:31
【问题描述】:
我正在尝试在 C 中创建一个函数,该函数返回任何给定 char 数组的子字符串。它给了我大部分正确的输出,但我也在字符串的开头得到了一些奇怪的字符。例如,当给定输入“abcdefg”并要求输入 3 到 5 个字符时,它给了我“ÀvWdef”。所以看起来我正确地切断了 g ,但它只是对前 3 个字符做一些奇怪的事情,而不是忽略它们。我的代码如下:
typedef char * String;
String subStr(String src, int start, int end){
if ((start > (strLen(src)-1)) || start < 0 || end < start ||
(end > (strLen(src) - 1)) ){
return NULL;
}
int s = start, e = end;
String r = (String)malloc((e - s + 1) * sizeof(char));
while(s <= e){
r[s] = src[s];
s++;
}
r[s] = '\0';
return r;
}
【问题讨论】:
-
关于这一行:'String r = (String)malloc((e - s + 1) * sizeof(char));' 1) 在 C 中,不要从 malloc(和函数系列)中转换返回值 2) 在使用返回值之前始终检查 (!=NULL) 以确保操作成功。 3) sizeof(char) 总是1,所以乘以1是浪费代码。建议删除 '*sizeof(char)'
-
如果 start == end,那么 malloc 显然是 1 个字符太短了。无论开始和结束之间的距离如何,这都适用。当 's' 最后一次递增,然后将 '\0' 分配到 's' 指向的当前位置,即超过分配缓冲区的末尾。这会导致未定义的行为,并且可能/将导致段错误事件
-
使用's'作为'r[]'的偏移量意味着复制的数据将写入'r[]'数组的末尾,除非'start = 0'