在c中使用指针练习时获得奇怪的输出

时间:2016-08-05 08:44:35

标签: c loops pointers

这是我的计划:

#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�'。我知道我的循环以某种方式终止了一个索引,但我不知道如何修复它。

我知道有内置功能可以帮助我解决这个问题,但我真的想找出问题,谢谢

2 个答案:

答案 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 -1EOF扩展到的内容)与char-1进行比较不会像你期望的那样工作。如果检查大多数返回字符的输入函数,您将看到它们返回int

答案 1 :(得分:1)

看起来你的函数没有在字符串的末尾插入\0destSize值为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] != EOFint main(void),并且必须返回一个值。