Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么strcat无法连接两个字符串?_C_String_Function - Fatal编程技术网

为什么strcat无法连接两个字符串?

为什么strcat无法连接两个字符串?,c,string,function,C,String,Function,我需要把一个数字转换成一个字符串。我是一个发牌人,给玩家发牌。这副牌包含40张牌。四颗种子 #include <stdio.h> #include <conio.h> #include <string.h> char *convertNum(int a); //initialization function void main(){ char *car=convertNum(30); printf(" number to convert 30

我需要把一个数字转换成一个字符串。我是一个发牌人,给玩家发牌。这副牌包含40张牌。四颗种子

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

char *convertNum(int a); //initialization function

void main(){
   char *car=convertNum(30);
   printf(" number to convert 30 : %s", car);
   getch();
}

char *convertNum(int a){
   char *seed, *value;
   switch ((a-1)/10){
      case 0: seed="C"; break;
      case 1: seed="Q"; break;
      case 2: seed="F"; break;
      case 3: seed="P"; break;
      default: seed="X"; break;
   }
   switch(a%10){
      case 0: value="10"; break;
      case 1: value="01"; break;
      case 2: value="02"; break;
      case 3: value="03"; break;
      case 4: value="04"; break;
      case 5: value="05"; break;
      case 6: value="06"; break;
      case 7: value="07"; break;
      case 8: value="08"; break;
      case 9: value="09"; break;
      default: value="XX"; break;
   }
   strcat(value, seed); /* ERROR: I need to concatenate the strings value and seed, but this isn't the right way */
   return value;
}
#包括
#包括
#包括
字符*convertNum(int a)//初始化函数
void main(){
char*car=convertNum(30);
printf(“要转换的编号30:%s”,car);
getch();
}
字符*convertNum(整数a){
字符*种子,*值;
开关((a-1)/10){
案例0:seed=“C”中断;
案例1:seed=“Q”中断;
案例2:seed=“F”中断;
案例3:seed=“P”中断;
默认值:seed=“X”break;
}
开关(a%10){
案例0:value=“10”中断;
案例1:value=“01”中断;
案例2:value=“02”中断;
案例3:value=“03”中断;
案例4:value=“04”中断;
案例5:value=“05”中断;
案例6:value=“06”中断;
案例7:value=“07”中断;
案例8:value=“08”中断;
案例9:value=“09”中断;
默认值:value=“XX”中断;
}
strcat(value,seed);/*错误:我需要连接字符串value和seed,但这不是正确的方法*/
返回值;
}

如何连接字符串<代码>值和种子是指针。

1.指针*值和*种子未初始化。他们没有名字。您需要使用malloc()或calloc()和一些内存块初始化这些指针,然后它就可以保存值


希望这对您有用

您将
种子
指向
开关
语句中的字符串文字。不允许使用
strcat()
修改字符串文字,因为它们存储在只读内存中

您可以使用
convertNum()
函数来解决您的问题。但是,当你不再需要字符串时,请不要忘记打电话。但是,您也可以从
main()
函数向
convertNum()
函数提供静态分配的字符数组。这在这里很有意义,因为结果字符串的固定长度始终为3个字符:

void main(){
    // Allocate an array of four characters and initialize it with zeros.
    // You need 4 characters, because strings need to be zero terminated.
    char car[4] = {0};
    // Pass (a pointer to) the array to your covertNum() function.
    convertNum(30, car);
    printf(" number to convert 30 : %s", car);
    getch();
}
然后您必须修改
convertNum()
函数,如下所示:

void convertNum(int a, char* result){
    char *seed, *value;
    switch ((a-1)/10){
        [...]
    }
    switch(a%10){
        [...]
    }
    strcpy(result, value);  // Copy 'value' to the beginning of the 'result' array.
    strcat(result, seed);   // Append 'seed' to 'value'; 'result' becomes zero-terminated.
}
这将提供以下输出:

要转换的数字30:10F


如果希望输出为
F10
,则必须在
convertNum()
函数的最后两行中切换
value
seed

在函数中,将指针
seed
value
分配给
switch
语句中的字符串文本,您需要做的是为这两个指针分配内存,使用
strcpy()
或其他标准库函数将字符串复制到它们,并在函数末尾连接。确保分配的内存足够大,可以容纳两个字符串以及
'\0'
字符。最后,完成后不要忘记释放分配的内存

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

char *convertNum(int a);

void main(){
   char *car=convertNum(30);
   printf("number to convert 30 : %s\n", car);
   free(car);
   getch();
}

char *convertNum(int a){
   char *seed = (char*)malloc(20*sizeof(char)), *value = (char*)malloc(20*sizeof(char));
   switch ((a-1)/10){
      case 0: strcpy(seed,"C"); break;
      case 1: strcpy(seed,"Q"); break;
      case 2: strcpy(seed,"F"); break;
      case 3: strcpy(seed,"P"); break;
      default: strcpy(seed,"X"); break;
   }
   switch(a%10){
      case 0: strcpy(value,"10"); break;
      case 1: strcpy(value,"01"); break;
      case 2: strcpy(value,"02"); break;
      case 3: strcpy(value,"03"); break;
      case 4: strcpy(value,"04"); break;
      case 5: strcpy(value,"05"); break;
      case 6: strcpy(value,"06"); break;
      case 7: strcpy(value,"07"); break;
      case 8: strcpy(value,"08"); break;
      case 9: strcpy(value,"09"); break;
      default:strcpy(value,"XX"); break;
  }
   strcat(value, seed);
   free(seed);
   return value;
}
#包括
#包括
#包括
字符*convertNum(int a);
void main(){
char*car=convertNum(30);
printf(“要转换的编号30:%s\n”,car);
免费(汽车);
getch();
}
字符*convertNum(整数a){
char*seed=(char*)malloc(20*sizeof(char)),*value=(char*)malloc(20*sizeof(char));
开关((a-1)/10){
案例0:strcpy(种子,“C”);断裂;
案例1:strcpy(种子,“Q”);断裂;
案例2:strcpy(种子,“F”);断裂;
案例3:strcpy(种子,“P”);断裂;
默认值:strcpy(seed,“X”);break;
}
开关(a%10){
案例0:strcpy(值,“10”);断裂;
案例1:strcpy(值,“01”);断裂;
案例2:strcpy(值,“02”);断裂;
案例3:strcpy(值,“03”);断裂;
案例4:strcpy(值,“04”);断裂;
案例5:strcpy(值,“05”);断裂;
案例6:strcpy(值,“06”);断裂;
案例7:strcpy(值,“07”);断裂;
案例8:strcpy(值,“08”);断裂;
案例9:strcpy(值,“09”);断裂;
默认值:strcpy(值,“XX”);break;
}
strcat(值、种子);
自由(种子);
返回值;
}

您尚未将内存分配给任何指针,连接它们将导致错误。首先分配足够的内存,然后连接。您阅读了strcat上的文档,然后从那里开始。除了不初始化指针或让指针指向分配的内存之外,无法返回指向本地数据的指针。这不是100%正确:指针
value
seed
指向
switch
语句中的字符串文本。它们指向某个内存,但不允许写入该内存。如果指针未初始化,我们如何证明它已分配内存,但我们无权在该内存中写入?