为什么strcat无法连接两个字符串?
我需要把一个数字转换成一个字符串。我是一个发牌人,给玩家发牌。这副牌包含40张牌。四颗种子为什么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
#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
语句中的字符串文本。它们指向某个内存,但不允许写入该内存。如果指针未初始化,我们如何证明它已分配内存,但我们无权在该内存中写入?