接收字符串作为空指针参数,并使用strcpy对其进行更改

接收字符串作为空指针参数,并使用strcpy对其进行更改,c,C,代码如下: #include <stdio.h> #include <string.h> void print (void*); int main (void) { char *a = "Mcwhat"; print(&a); printf("\n%s", a); return 0; } void print (void *text) { char* pchar[5]; *pchar = (char*)text;

代码如下:

#include <stdio.h>
#include <string.h>

void print (void*);

int main (void)
{
  char *a = "Mcwhat";
  print(&a);
  printf("\n%s", a);
  return 0;
}

void print (void *text)
{
    char* pchar[5];

    *pchar = (char*)text;

    strcpy( *pchar, "Mcthat" );
}
#包括
#包括
作废打印(作废*);
内部主(空)
{
char*a=“Mcwhat”;
打印(&a);
printf(“\n%s”,a);
返回0;
}
作废打印(作废*文本)
{
char*pchar[5];
*pchar=(char*)文本;
strcpy(*pchar,“Mcthat”);
}

我试图使用void参数将Mcwhat转换为Mcthat,但printf随后给了我一个分段错误。我的错在哪里?我设法一个字符一个字符地做,但现在我想更改整个字符串。在我的C语言书中没有找到足够的资料。

就这样写吧

void print (char *text)
{    
    strcpy( text,  "Mcthat" );
}
但是要确保
文本的大小足够大,可以将
中的“Mcthat”
放入其中

同样在
main
中:

print(a);
而不是

print(&a);  // would requite void print (char** text) 
整个谢邦:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print (void*);
int main (void)
{
  char *a = malloc(strlen("Mcwhat")+1);
  print(a);
  printf("\n%s\n", a);
  free(a);
  return 0;
}

void print (void *text)
{
    strcpy(text, "Mcthat" );
}
#包括
#包括
#包括
作废打印(作废*);
内部主(空)
{
char*a=malloc(strlen(“Mcwhat”)+1);
印刷品(a);
printf(“\n%s\n”,a);
免费(a);
返回0;
}
作废打印(作废*文本)
{
strcpy(文本,“Mcthat”);
}

您的代码中有很多问题:
1.字符数组应该足够大以存储字符串<代码>字符[5]
无法保存Mswhat。
2.
char*pchar[5]
声明5个字符指针,而您需要一个指向字符数组的字符指针

我已经改正了

#include <stdio.h>
#include <string.h>

void print (char*);

int main (void)
{
  char *a = malloc(10);
  strcpy(a,"Mcwhat");
  print(a);
  printf("\n%s", a);
  free(a);
  return 0;
}

void print (char *text)
{
  char *pchar = text;
  strcpy( pchar, "Mcthat" );
}
#包括
#包括
空白打印(字符*);
内部主(空)
{
char*a=malloc(10);
strcpy(a,“Mcwhat”);
印刷品(a);
printf(“\n%s”,a);
免费(a);
返回0;
}
无效打印(字符*文本)
{
char*pchar=文本;
strcpy(pchar,Mcthat);
}

保持简单,注意变量的类型:

#include <stdio.h>
#include <string.h>

void print (void*);

int main()
{
  char a[] = "Mcwhat"; // a is now a read-write array
  print(a); // a decays to a pointer, don't take its adress or you'll get a pointer-to-pointer
  printf("\n%s", a);
  return 0;
}

void print (void *text)
{
    strcpy( text, "Mcthat" ); // Don't dereference text here
}
#包括
#包括
作废打印(作废*);
int main()
{
char a[]=“Mcwhat”//a现在是一个读写数组
print(a);//a衰减为指针,不要获取它的地址,否则会得到指向指针的指针
printf(“\n%s”,a);
返回0;
}
作废打印(作废*文本)
{
strcpy(text,“Mcthat”);//不要在此处取消引用文本
}

请注意,这个“打印”功能在所有可以想象的方面都是不安全的,但这不是问题所在。

使用
void*
是个坏主意。你一下子就删除了编译器的很多功能为什么你们一定要投票否决我?这是一个很好的问题,网站上没有类似的问题,只有有限的人能够回答。更正了吗?你显然在泄露内存。打印的前两行甚至没有意义,您正在分配指针两次。分段错误:#0 004016F3打印(text=0x405064)(E:\Projects and Documents\Programming\C\CodeBlocks\Tester#1\main.C:16)#1 004016D2 main()(E:\Projects and Documents\Programming\C\CodeBlocks\Tester#1\main.C:9)编辑以查看整个内容。没有segfault,我测试过。这段代码将7个字节写入一个6字节长的缓冲区。