【问题标题】:How to add a char/int to an char array in C?如何在 C 中将 char/int 添加到 char 数组中?
【发布时间】:2016-03-07 11:02:24
【问题描述】:

如何添加“。”到 C 中的 char Array := "Hello World",所以我得到一个 char Array:"Hello World"。这个问题看起来很简单,但我很挣扎。

尝试了以下方法:

char str[1024];
char tmp = '.';

strcat(str, tmp);

但它不起作用。它向我显示了错误:“传递'strcat'的参数2使指针从整数而不进行强制转换” 我知道在 C 中 char 也可以转换为 int 。我是否还必须将 tmp 转换为 char 数组,还是有更好的解决方案?

【问题讨论】:

  • Str 不包含字符串,只是大小声明呵呵
  • 这只是一个用 Hello World 来描述问题的例子。在我的真实程序中,它必须是空的。程序稍后会填充它。问题只是包含将 char/int 添加到 char 数组
  • @MikeCAT 语言错误。

标签: c


【解决方案1】:

strcat 有声明:

char *strcat(char *dest, const char *src)

它需要 2 个字符串。 While this compiles:

char str[1024] = "Hello World";
char tmp = '.';

strcat(str, tmp);

这将导致内存问题,因为strcat 正在寻找一个以空值结尾的 cstring。你可以这样做:

char str[1024] = "Hello World";
char tmp[2] = ".";

strcat(str, tmp);

Live example.

如果你真的想附加一个字符,你需要创建你自己的函数。像这样的:

void append(char* s, char c) {
        int len = strlen(s);
        s[len] = c;
        s[len+1] = '\0';
}

append(str, tmp)

当然,您可能还想检查字符串大小等以确保内存安全。

【讨论】:

  • 我删除了我的答案并支持你的答案,你解释得更好
  • 这是要走的路。您的附加功能将完成这项工作。
  • 我必须用 char 类型的变量定义 char tmp[2]。 (char temp = x; char tmp[2] = temp; ) 但它告诉我我的初始化程序无效。问题出在哪里?
  • @missjohanna 只需使用附加功能。您不能将 char 分配给 char[] 它们是不同的类型。
  • 对不起,我可能有点烦人,但我是来学习的。 char 数组的一个元素不是 char 吗?在缓存中它不是存储为 char1 char2 char3... 为什么我不能更改其中一个的值?
【解决方案2】:

我想你忘记了初始化你的字符串“str”:你需要在使用 strcat 之前初始化字符串。而且您还需要 tmp 是一个字符串,而不是单个字符。尝试改变这个:

char str[1024]; // Only declares size
char tmp = '.';

char str[1024] = "Hello World";  //Now you have "Hello World" in str
char tmp[2] = ".";

【讨论】:

    【解决方案3】:

    错误是因为您将错误传递给strcat()。看strcat()的原型:

       char *strcat(char *dest, const char *src);
    

    但是您将char 作为第二个参数传递,这显然是错误的。

    请改用snprintf()

    char str[1024] = "Hello World";
    char tmp = '.';
    size_t len = strlen(str);
    
    snprintf(str + len, sizeof str - len, "%c", tmp);
    

    正如 OP 所说:

    这只是一个用 Hello World 来描述问题的例子。它 在我的真实程序中必须是空的。程序稍后会填充它。 问题只是包含将 char/int 添加到 char 数组

    在这种情况下,snprintf() 也可以轻松地将其“附加”整数类型到 char 缓冲区。 snprintf() 的优点是可以更灵活地将各种类型的数据拼接到一个 char 缓冲区中。

    例如连接字符串、char 和 int:

    char str[1024];
    ch tmp = '.';
    int i = 5;
    
    // Fill str here
    
    snprintf(str + len, sizeof str - len, "%c%d", str, tmp, i);
    

    【讨论】:

      【解决方案4】:

      在 C/C++ 中,字符串是一个以 NULL 字节结尾的字符数组 ('\0');

      1. 您的字符串 str 尚未初始化。
      2. 您必须连接字符串,并且尝试将单个字符(没有空字节,因此它不是字符串)连接到字符串。

      代码应如下所示:

      char str[1024] = "Hello World"; //this will add all characters and a NULL byte to the array
      char tmp[2] = "."; //this is a string with the dot 
      strcat(str, tmp);  //here you concatenate the two strings
      

      请注意,您只能在数组声明期间将字符串文字分配给数组。
      例如下面的代码是不允许的:

      char str[1024];
      str = "Hello World"; //FORBIDDEN
      

      应该替换为

      char str[1024];
      strcpy(str, "Hello World"); //here you copy "Hello World" inside the src array 
      

      【讨论】:

        【解决方案5】:

        建议更换这个:

        char str[1024];
        char tmp = '.';
        
        strcat(str, tmp);
        

        用这个:

        char str[1024] = {'\0'}; // set array to initial all NUL bytes
        char tmp[] = "."; // create a string for the call to strcat()
        
        strcat(str, tmp); // 
        

        【讨论】:

        • 这是我作为示例给出的问题的解决方案。但是我说一个是char数组,另一个是char。如果它只是 2 个字符数组,那根本没有问题。在我的主程序中,我从 fgetc 获得一个 char 或 int。如果我写它可能会起作用: char tmp[2]; tmp[1] = fgetc();但不确定!
        • 鉴于您对问题的修改,您可以尝试: char newstr[strlen(str)+2] = {'\0'}; strcpy(newstr, str); newstr[strlen(newstr)] = tmp;
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        相关资源
        最近更新 更多