如何在C中将char转换为字符串?

时间:2015-02-06 19:54:41

标签: c

我是C的新手,我遇到使用strcat()的问题。我查了strcat并发现它需要字符串作为参数,但是当我从char数组中拆分项时是一个char,当我用它作为strcat的参数时,它会输出错误。

#include <stdio.h>
#include <string.h>
int main()
{   
char a[10]="abcdefg123";
char *pa=a;
char *out[2]={"",""};
int counter=0;
while(*pa != '\0'){
    if (counter%2==0){
        strcat(out[0],*pa);
    }
    else{
    strcat(out[1],*pa);
    }

    counter++;
    pa++;    
   } 
printf("%s,%s\n",out[0],out[1]);

return 0;
}

代码的目的是将一个字符串拆分为两个字符串,每个字符串包含奇数位置或偶数位置的所有字符。但是,当我取消引用字符指针时,我得到的只是一个字符,但似乎我需要串

4 个答案:

答案 0 :(得分:2)

strcat中使用临时字符串,而不是strcat(out[0],*pa);

另外,请确保为out分配足够的内存。

int main()
{   
   char a[10]="abcdefg123";
   char temp[2] = {0};
   char *pa=a;

   // This is not good for `strcat`.
   // char *out[2]={"",""};

   // Use this instead.
   char out[2][20]={"",""};

   int counter=0;
   while(*pa != '\0'){
      temp[0] = *pa;
      if (counter%2==0){
         strcat(out[0], temp);
      }
      else{
         strcat(out[1], temp);
      }

      counter++;
      pa++;    
   } 
   printf("%s,%s\n",out[0],out[1]);

   return 0;
}

答案 1 :(得分:0)

第1点。根据strcat()

man page
  

。 .. dest字符串必须有足够的空间用于结果。

第2点。strcat()的第二个参数是const char *,因此调用不能是strcat(out[0],*pa);。您需要使用临时数组,它只包含值*pa。否则,您可以使用strncat()之类的

 strncat(out[0], pa, 1);  // copy only 1 char

在以后的情况下,您不需要任何临时数组。

参考:从手册页,再次,

  

strncat()函数类似,但它将使用来自n的最多src个字节,而src如果包含{n则不需要以空值终止{1}}或更多字节。

答案 2 :(得分:0)

strcat()需要一个指向以null结尾的字符串的指针。您正在取消引用一个指针(使用*运算符),它提供了一个char。您不能简单地将char转换为指向sting的指针。您可能希望使用memcpy()而不是strcat(),但是为了复制单个字节,在左侧和右侧使用*运算符的简单赋值就可以了。但正如其他人已经指出你的代码没有为你复制字符分配空间,所以你需要做出额外的修改来解决这个问题。此外,您必须记住将最后一个空字节复制到两个输出字符串的末尾。

答案 3 :(得分:0)

在C中,“字符串”实际上只是指向字符的指针;字符串从该字符运行到终止的0字节(NUL)。

如果取消引用字符串指针,则会获得该位置的字符。如果指针指向字符串的开头,则获取字符串的第一个字符。

您的程序存在一些问题。首先,您需要为新字符串分配空间。 strcat()会尝试在任何你告诉它的地方复制字符,但确保那里有空间并且可以写在那里是你的工作。 out的声明只声明了两个指针,并将它们初始化为指向零长度的常量字符串。相反,您需要分配存储,例如:

char out0[64], out1[64];
char *out[]={out0, out1};

这使得两个输出缓冲区各为64个字符,然后设置out并指向它们。

另一个问题:你为char数组声明了一个10的长度,但是你用一个长度为10的字符串初始化它。这意味着没有空间用于终止NUL字节,C不会放置一个。然后strcpy()strcat()将从字符串中复制额外的垃圾,直到碰巧有一个NUL字节。如果你很幸运的话会有一个你马上就会发现错误,但是如果你不幸运,你会得到奇怪的垃圾。

让编译器计算字符串中的字节数并做正确的事情。遗漏长度:

char a[]="abcdefg123";