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

时间:2016-01-14 10:53:45

标签: 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 : %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;
}

我可以做什么来连接字符串? valueseed是指针。

3 个答案:

答案 0 :(得分:2)

1.指针*值和*种子未初始化。他们没有任何记录。你需要使用malloc()或calloc()和一些内存块初始化那些指针,然后它可以保存值。

希望这对你有用

答案 1 :(得分:0)

您将valueseed指向switch语句中的字符串文字。您不能使用strcat()修改字符串文字,因为它们存储在只读内存中。

您可以在convertNum()功能中使用malloc()来解决问题。但是,当您不再需要字符串时,请不要忘记拨打free()。但是,您还可以提供从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,则必须在value函数的最后两行中切换seedconvertNum()

答案 2 :(得分:0)

在您的函数中,您将指针seedvalue分配给switch语句中的字符串文字,但是,您需要做的是为这两个指针分配内存,使用strcpy()或其他标准库函数将字符串复制到它们,并在函数结束时连接。确保分配的内存足够大,以便将两个字符串与'\0'字符一起保存。最后不要&# 39;完成后忘记释放已分配的内存。

#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;
}