0

我想将一组字符转换为一个字符串。

例子:

char foo[2] = {'5', '0'};-->char* foo = "50";

在 C 中执行此操作的最佳方法是什么?问题源于一个更大的问题,我试图从命令行输入中提取子字符串。例如,我想把argv[1][0]argv[1][1]变成一个字符串,这样如果程序像这样运行......

$ ./foo 123456789

我可以将“12”分配给一个char*变量。

4

6 回答 6

3

就像是:

char* foo_as_str = malloc(3);
memset(foo_as_str, 0, 3);
strncpy(foo_as_str, argv[1], 2);
于 2012-08-13T22:09:05.743 回答
3

重写您的示例,因为您无法char[]使用多个文字字符串初始化 a :

char foo[3] = { '5', '0', '\0' }; // now foo is the string "50";

请注意,如果要保存字符串,则数组中至少需要3 个元素:附加元素用于空终止字符,这在 C 字符串中是必需的。我们上面的等价于:foo"50"

char foo[3] = "50";

但是你不需要这个来提取前两个字符argv[1],你可以使用strncpy

char foo[3];
foo[0] = '\0';

if ((argc > 1) && (strlen(argv[1]) >= 2)
{
    // this copies the first 2 chars from argv[1] into foo
    strncpy(foo, argv[1], 2);
    foo[2] = '\0';
}
于 2012-08-13T22:10:16.123 回答
2

查看strcat的手册页。注意覆盖常量字符串。

如果您只想将字符放在一起形成一个字符串,也可以这样做:

char foo[3];
foo[0] = '1';
foo[1] = '2';
foo[2] = 0;
于 2012-08-13T22:08:27.373 回答
1

要创建一个字符串,您需要在两个字符之后添加一个空终止字节。这意味着它们后面的内存地址需要在您的控制之下,以便您可以写入它而不会弄乱其他任何人。在这种情况下,您需要为字符串分配一些额外的内存:

int length = 2; // # characters
char* buffer = malloc(length + 1); // +1 byte for null terminator
memcpy(buffer, foo, length); // copy digits to buffer
buffer[length] = 0; // add null terminating byte

printf("%s", buffer); // see the result
于 2012-08-13T22:08:34.903 回答
1

您可以使用strcat,但您必须确保目标缓冲区足够大以容纳结果字符串。

于 2012-08-13T22:09:22.150 回答
0

尝试使用strcat().

  char *foo[2] = {"5", "0"}; /* not the change from foo[x] to *foo[x] */ 
  size_t size = sizeof(foo) / sizeof(foo[0]);
  char *buf = calloc(sizeof(char), size + 1);
    if(buf) {
      int i;
      for(i = 0; i < size; ++i)
    strcat(buf, foo[i]);
      printf("buf = [%s]\n", buf);
    } else {
      /* NO momeory. handling error. */
    }

输出:

buf = [50]
于 2012-08-13T22:08:45.040 回答