我的作业需要复制一个字符串' 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);
}
答案 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;
}
答案 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);
}