【问题标题】:Getting weird output when practising using pointer in c在 c 中练习使用指针时得到奇怪的输出
【发布时间】:2016-08-05 08:44:34
【问题描述】:

这是我的程序:

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

我知道有内置函数可以帮助我解决这种情况,但我真的想找出问题所在,谢谢

【问题讨论】:

  • @iwin:这行不通。如果目标缓冲区是 50 字节长,我们将一个 12 字符的字符串复制到其中,则索引 12 到 50 的字符将是垃圾

标签: c loops pointers


【解决方案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

【讨论】:

    【解决方案2】:

    您的函数似乎没有在字符串末尾插入\0destSize 的值为 5,所以一旦你复制了 s 字符,下一次迭代将停止循环,因为 i 将低于 destsize - 1,因此不会处理 else 子句。

    要绕过这个,您应该在for 循环之后插入\0,如下所示:

    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 是没用的。你的 main 函数也不是标准的,应该是int main(void)int main(int argc, char *argv[]) 并且它必须返回一个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多