把数组y里的字符串接到x里字符串的后面。为什么打印*a是乱码?

#include "stdafx.h"

char** strnlen ( char* a , char* s )
{
char** d = &a;
while( a != 0)
{
*a++;
}
while( *s != 0 )
{
*a = *s;
*a++;
*s++;
printf("%c",*a);
}
return d;
}
int main(int argc, char
argv[])
{

char name[] = "china";
char name1[] = "chinese";
strnlen(name,name1);


return 0;

}

运行后

烫€

2个回答

从main开始看 定义一个名为name和name1的数组,里面放着的是china和chinese,没问题
下一行是一个实现连接的函数,看着也没问题,但理论上你想name你只给他分配一个china的空间,只有那么大,后面连的是chinese给它放哪儿了?连好了也是占有的不合法的不是可以使用空间,写的时候要注意
跳至char** strnlen ( char* a , char* s )这个函数,a指向name,s,指向name 返回一个指向指针的指针

char** d = &a;这个指针d是指向指针a的,也就相当于a 改变了d也改变了(这里为什么我就不说了哈)
while( a != 0)这一句,a里面放的是地址,你看你的下面的s带了*号,不多解释
{
a++;这一句,++和是同一级别的,规则是从右至左看,所以这句话也就是*(a++)a先后自增,然后对a取值一下,你觉的最后的取值有意义吗?
}

while( *s != 0 )//我的s所指的字符不是结束符(对的)
{
*a = *s;那我就把s所指的字符赋值给a所指的空间(对的)
*a++;a指向下一个地址(同上面第一个while里的*a++不多解释)
*s++;s指向下一个地址(同上面第一个while里的*a++不多解释)
printf("%c",*a);输出所指向的字符???你的a已经在上两行++了你输出的是a还没有进行赋值的空间的值
}
return d;d你指向了a,上面说了,a一变,d也就变了,你的d就是最后a指向的空间

这个是我改以后的代码

void strnlen ( char* a , char* s )
{
char* d = a;//d指向a所指向的也就是d指向name就行,a变了,d不变,才能找到一个字符串的首地址呀
while( *a != 0)
{
a++;
}

while( *s != 0 )
{
*a = *s;
a++;
s++;
}
*a='\0';//一定要记得这个,一个字符串要有终束符
printf("%s",d);

}
int main(int argc, char argv[])
{

char name[] = "china";
char name1[] = "chinese";
strnlen(name,name1);

return 0;

}

可以看出对指针有一定的概念,但对指针具体指的是什么还不太清楚,可以先弄懂指针指向的是什么,然后多做题巩固下,有些没说太清,自己可以摸索下

#include "stdio.h"

char** strnlen ( char* a , char* s )
{
    char** d = &a;
    while( (*a) != 0)
    {
        a++;
    }
    while( (*s) != 0 )
    {
        *a = *s;
        *a++;
        *s++;
    }
    *a = '\0';
    return d;
}
int main(int argc, char argv[]) 
{
    char name[100] = "china";
    char name1[] = "chinese";
    strnlen(name,name1);
    printf("%s", name);

    return 0;
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问