将2个字符加在一起形成一个字符*

时间:2018-09-24 18:30:05

标签: c pointers

所以,如果我有

char a = 'a';
char b = 'b';
char* combination = a + b;

结果应为

combination = "ab"

我该怎么做?我99%确信“ +”运算符在这里不起作用,但是我不确定应该怎么做。我是C语言的新手,很抱歉这个问题多么简单!

edit **是否可以在不使用数组的情况下进行此操作?不使用方括号[]

的含义

3 个答案:

答案 0 :(得分:2)

  

将2个字符加在一起形成一个字符* ...我该怎么做?

直接执行此操作的方法,因为C99在下面,它使用复合文字@haccks@unwind

char a = 'a';
char b = 'b';

//                   v-------------------v--- compound literal
char* combination1 = (char[]) {a, b, '\0'};

printf("<%s>\n", combination1);

combination1的有效期直到代码块结束。

  

我99%确信“ +”运算符在这里不起作用,

OP是正确的,+不是正确的方法。


  

有可能不使用数组吗?不使用方括号[]

的含义

这是一个很好的限制性要求。

代码可以分配内存,然后分配。

char *concat2char(char a, char b) {
  char *combination = malloc(3);
  if (combination) {
    char *s = combination;
    *s++ = a;
    *s++ = b;
    *s = '\0';
  }
  return combination;
}

// Sample usage
char *combination2 = concat2char('a', 'b');
if (combination2) {
  printf("<%s>\n", combination2);
  free(combination2);  // free memory when done
}

使用3名成员struct似乎是一种选择,但可移植代码并不依赖于s3被打包。

struct {
  char a, b, n;
} s3 = {a, b, '\0' };

// Unreliable to form a string, do not use !!
char* combination3 = (char *) &s3;

printf("<%s>\n", combination);

答案 1 :(得分:1)

您需要设置一个至少比最终字符串中的字符数大一个元素的目标数组:

char str[3]; // 2 characters plus string terminator

str[0] = a;
str[1] = b;
str[2] = 0; // you'll sometimes see that written as str[2] = '\0'

没有为字符串操作定义+=运算符。您必须使用str*库函数(strcatstrcpystrlen等)进行字符串操作。

编辑

在C中,字符串是由0值字节终止的字符值序列-字符串"hello"由字符序列{'h', 'e', 'l', 'l', 'o', 0}表示(有时您将会看到'\0'而不是普通的0)。字符串存储char数组中。像"hello"这样的字符串文字存储在char的数组中,这样它们在程序的整个生命周期中都是可见的,但并不意味着要进行修改-尝试更新字符串文字的内容会导致未定义行为(代码可能会崩溃,操作可能不会成功,代码可能会出现预期的行为等)。

除非它是sizeof或一元&运算符的操作数,或者是用于初始化声明中的字符数组的字符串文字,否则 expression 为类型“ T的N元素将被转换(“衰变”)为类型“指向T的指针”的表达式,该表达式的值将是第一个元素的地址。因此,当我们处理字符串时,通常会处理char *类型的表达式-但是,这并不意味着char *总是引用 string 。它可以指向不属于字符串的单个字符,也可以指向不带0终止符的字符序列。

因此,让我们从像"hello"这样的字符串文字开始。它将作为数组存储在“某处”:

+---+---+---+---+---+---+
|'h'|'e'|'l'|'l'|'o'| 0 |
+---+---+---+---+---+---+

写类似的东西

char *str = "hello";

存储"hello"的数组的第一个元素的地址被写入 pointer 变量str

     +---+      +---+---+---+---+---+---+
str: |   | ---> |'h'|'e'|'l'|'l'|'o'| 0 |
     +---+      +---+---+---+---+---+---+

虽然您可以阅读每个str[i],但不应对其进行写入(从技术上讲,行为是未定义的)。另一方面,当您编写如下内容时:

char str[] = "hello";

str被创建为 array ,并将字符串文字的 contents 复制到该数组:

+---+---+---+---+---+---+
|'h'|'e'|'l'|'l'|'o'| 0 |
+---+---+---+---+---+---+

     +---+---+---+---+---+---+
str: |'h'|'e'|'l'|'l'|'o'| 0 |
     +---+---+---+---+---+---+

该数组的大小取决于初始化程序的大小,因此它将为6个元素宽(字符串终止符为+1)。如果数组要保留连接或打印操作的结果,则它必须足够大以容纳结果字符串,再加上0终止符,并且C数组不会随着向其添加内容而自动增长。因此,如果要将两个3个字符的字符串连接在一起,则目标数组的宽度必须至少为 7个元素:

char result[7];
char *foo = "foo";
char *bar = "bar";

strcpy( result, foo ); // copies contents of foo to result
strcat( result, bar ); // appends the contents of bar to result

答案 2 :(得分:1)

只需定义一个数组,并将两个字符排列到其中,然后以最后的零字符结束以形成适当的C字符串即可:

const char a = 'a';
const char b = 'b';
const char my_string[] = { a, b, '\0' };
printf("The string is '%s'\n", my_string);

为回应评论(我听不懂,但是我在这里为您提供帮助,呵呵),这是一种歪曲的写法,没有括号。

uint32_t memory;
char *p = (char *) &memory;
*p++ = a;
*p++ = b;
*p-- = '\0';
printf("the string is '%s'\n", --p);

注意:这段代码是荒谬的,但不要使用您正在编程的语言的随机部分的请求也是如此。请勿将这段代码用于任何用途,除非在此处阅读并认为“哇,如果我能用牙套的话,那就太好了。”