字符串复制问题

时间:2018-02-06 08:34:42

标签: c string

我的作业需要复制一个字符串' src'到一个字符串' dst'但我需要在没有" string.h"并且字符串不会以' \ 0'结尾相反,他们正在结束'?' 。所以这个功能" es_cat"需要返回返回字符串的字符数,在这种情况下是26,这对我来说是正确的。但问题是字符串" dst"函数完成后应该是返回字符串,在函数中我甚至可以放置" c = dst"然后打印它,它告诉我,这是正确的返回字符串,但仍然来自分配检查器,我将收到此错误:

test_source.c:129:F:test_es_cat:test_es_cat:0:[07_altstring.c]复制的字符串输入不正确" Foobar123neljaa?viisibaz"和" 56seitseman?kasiysikymppi"。应该是" Foobar123neljaa56seitseman?",你有" Foobar123neljaa?viisibaz"

int es_cat(char *dst, char *src) {
   char c[100] = {dst[0]};
   int i = 0;
   while (*dst != '?') {
       c[i] = *dst;
       dst++;
       i++;
   }
   while (*src != '?') {
       c[i] = *src;
       src++;
       i++;
   }
   c[i] = '?';
   dst = c;
   printf("\n%s", dst);
   return i;
}
int main(void) {
   char lol[256] = "Foobar123neljaa?viisibaz";
   char asd[256] = "56seitseman?kasiysikymppi";
   int res = es_cat(lol, asd);
   printf("\n%d", res);
}

2 个答案:

答案 0 :(得分:1)

请记住,在C语句中,按值传递。这意味着它们被复制,并且该函数可以根据需要修改自己的副本,而不会发生任何事情。执行dst = c后,您修改了dst本地副本,而不是lol变量指向main函数内的内容。

除此之外,您尝试做的是让dst指向局部变量 c(或者更确切地说是c的第一个元素)。这是有问题的,因为一旦函数返回c将超出范围并且不再存在。

要解决此问题,我建议您在 c 函数中创建数组main,并将指向其第一个字符的指针作为函数的参数传递。< / p>

如果您确实要将字符串实际复制到dst,那么首先您不能让lol成为指向字符串文字的指针,因为文字字符串是只读字符。由于只读,您无法修改它们,而作为数组,它们具有无法修改的固定大小。要解决这个问题,你可以做到这一点。

char lol[256] = "Foobar123neljaa?viisibaz";

这使lol成为可以修改其内容的数组。并且希望足够大以包含完整的连接字符串。而不只是复制指针(dst = c会发生什么),你应该直接写到dst(或至少copy)。

因为你似乎需要手持,并且似乎不能自己思考(苛刻但这看起来像是什么)这里有一个功能强大的程序,可以修改dst in位:

#include <stdio.h>

int es_cat(char *dst, const char *src)
{
    // Save so we can calculate the length later
    const char *orig_dst = dst;

    // First find the insertion point in the destination string
    while (*dst != '\0' && *dst != '?')
    {
        ++dst;
    }

    // Now dst is either pointing to the terminator, or the '?'
    // Copy from src into dst, until the "end" of src
    while (*src != '\0' && *src != '?')
    {
        *dst++ = *src++;
    }

    // Terminate the destination
    *dst = '\0';

    // Calculate the length of the string in dst, and return it
    return dst - orig_dst;
}

int main()
{
    char lol[256] = "Foobar123neljaa?viisibaz";
    const char *asd = "56seitseman?kasiysikymppi";

    int ret = es_cat(lol, asd);
    printf("result = '%s', length = %d\n", lol, ret);

    return 0;
}

See here for it running

答案 1 :(得分:1)

你在这里遇到的问题很少。首先要把目标字符串放得足够大,以便它可以复制源字符串,如果source更大,另外一件事是你需要在es_cat中直接赋值strcpy(或者memcpy,strcpy是首选)本地数组c的指针不会在目标中复制整个字符串,您的代码可能如下所示:

#define STRING_SIZE  1000
int es_cat(char *dst, char *src) {
   char c[STRING_SIZE*2];
   int i = 0;
   while (*dst != '?') {
       c[i] = *dst;
       dst++;
       i++;
   }
   while (*src != '?') {
       c[i] = *src;
       src++;
       i++;
   }
   c[i] = '?';
   memcpy(dst,c,i);
   dst[i+1] = '\0';//add null
   printf("\n%s", dst);
   return i;
}
int main(void) {
   char dest[STRING_SIZE*2] = "Foobar123neljaa?viisibaz";
   char source[STRING_SIZE] = "56seitseman?kasiysikymppi";
   int res = es_cat(lol, asd);
   printf("\n%d", res);
}