这是我的计划:
#include <stdio.h>
int tokenCopy(char* dest, const char* src, int destSize)
{
int i;
for (i = 0; i < destSize-1; i++) {
if (src[i] != '\0' && src[i] != EOF && src[i] != ' '){
dest[i] = src[i];
} else {
dest[i] = '\0';
break;
}
}
return i;
}
int main()
{
char buff[5];
int n = tokenCopy(buff, "This is a string", 5);
printf("%d '%s'\n", n, buff);
}
我尝试使用它来将字符串中的字符串提取复制到另一个字符串。有了这个测试用例,我应该得到4 'This'
。但我得到了4 'This�'
。我知道我的循环以某种方式终止了一个索引,但我不知道如何修复它。
我知道有内置功能可以帮助我解决这个问题,但我真的想找出问题,谢谢
答案 0 :(得分:1)
for
循环将一直运行直到它完成(循环内的else
情况永远不会发生),然后你只需从函数返回而不将终结符添加到目标字符串。
您需要在循环之后添加终结符,而不是在循环内的else
中添加。
固定功能应该看起来像
int tokenCopy(char* dest, const char* src, int destSize)
{
int i;
for (i = 0; i < destSize-1; i++) {
if (src[i] != '\0' && src[i] != ' '){
dest[i] = src[i];
} else {
// Don't terminate here, just break out of the loop
break;
}
}
dest[i] = '\0'; // Terminate string
return i;
}
请注意,我也删除了EOF
检查,它几乎没用,因为没有标准输入函数应该将它放在它写入的数组中。还有一个问题是将 int
值-1
(EOF
扩展到的内容)与char
值-1
进行比较不会像你期望的那样工作。如果检查大多数返回字符的输入函数,您将看到它们返回int
。
答案 1 :(得分:1)
看起来你的函数没有在字符串的末尾插入\0
。 destSize
值为5,因此一旦复制s
字符,下一次迭代将停止循环,因为i
将低于destsize - 1
,因此{{1} }子句不会被处理。
要绕过此问题,您应该在else
循环之后插入\0
,如下所示:
for
此外,您的条件int i;
for (i = 0; i < destSize-1; i++) {
if (src[i] != '\0' && src[i] != EOF && src[i] != ' '){
printf("Copy %c\n", src[i]);
dest[i] = src[i];
}
}
dest[i] = '\0';
return i;
毫无用处。您的主要功能也不是标准功能,它应该是src[i] != EOF
或int main(void)
,并且必须返回一个值。