【问题标题】:C char to string (passing char to strcat())C char 到字符串(将 char 传递给 strcat())
【发布时间】:2011-01-21 19:00:39
【问题描述】:

我的问题是将字符转换为字符串 我必须将一个字符传递给 strcat() 以附加到一个字符串,我该怎么办? 谢谢!

#include <stdio.h>
#include <string.h>

char *asd(char* in, char *out){
    while(*in){
        strcat(out, *in); // <-- err arg 2 makes pointer from integer without a cast
        *in++;
    }
    return out;
}

int main(){
    char st[] = "text";
    char ok[200];
    asd(st, ok);
    printf("%s", ok);
    return 0;
}

【问题讨论】:

    标签: c string char strcat


    【解决方案1】:

    由于ok 指向一个未初始化的字符数组,它都是垃圾值,所以连接(strcat)将从哪里开始是未知的。 strcat 也接受一个 C 字符串(即一个以 '\0' 字符结尾的字符数组)。给char a[200] = "" 会给你a[0] = '\0',然后a[1] 到a[199] 设置为0。

    编辑:(添加了代码的更正版本)

    #include <stdio.h>
    #include <string.h>
    
    char *asd(char* in, char *out)
    {
    
    /*
        It is incorrect to pass `*in` since it'll give only the character pointed to 
        by `in`; passing `in` will give the starting address of the array to strcat
     */
    
        strcat(out, in);
        return out;
    }
    
    int main(){
        char st[] = "text";
        char ok[200] = "somevalue"; /* 's', 'o', 'm', 'e', 'v', 'a', 'l', 'u', 'e', '\0' */
        asd(st, ok);
        printf("%s", ok);
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      strcat 不会附加单个字符。相反,它需要一个 const char*(一个完整的 C 风格的字符串),它被附加到第一个参数中的字符串。所以你的函数应该是这样的:

      char *asd(char* in, char *out)
      {
          char *end = out + strlen(out);
      
          do
          {
              *end++ = *in;
      
          } while(*in++);
      
          return out;
      }
      

      do-while 循环将包含零终止符,这在 C 样式字符串的末尾是必需的。确保您的输出字符串在末尾使用零终止符进行初始化,否则此示例将失败。

      顺便说一句:想想*in++; 做了什么。它将增加in并取消引用它,这与in++非常相同,因此*是无用的。

      【讨论】:

        【解决方案3】:

        要查看您的代码,我可以提出一些与它相关的建议,这不是批评,请稍加注意,这将使您成为更好的 C 程序员:

        • 没有函数原型。
        • 指针使用不正确
        • 处理strcat函数使用不当。
        • 过度使用 - 不需要 asd 函数本身!
        • 处理变量的用法,尤其是未正确初始化的 char 数组。
        #include #include 诠释主要(){ 字符 st[] = "文本"; 字符确定[200]; 好的[0] = '\0'; /* 要么 memset(ok, 0, sizeof(ok)); */ strcat(ok, st); printf("%s", ok); 返回0; }

        希望这会有所帮助, 最好的祝福, 汤姆。

        【讨论】:

        • 使用“asd”函数允许在其他上下文中使用 asd,允许 main 忽略 asd 本身背后的计算。我总是选择一个函数,不管是什么情况。
        • 另外,你的 memset() 是完全不相关的,只要这样声明: char ok[200] = { 0 };
        • @rogue:你可以那样做你的风格!
        • 对的人,或者你可以做ok[200] = ""; all-in-one statement。这完全是风格问题。
        • 谢谢大家 我很感激你们的赞美,因为我总是试图理解程序员是如何工作的,因为我在哪里学习,理解所有的书,感谢 cmets 我可以理解计划中最重要的部分你说的一切我都有。但是我所做的示例,我编写代码只是为了给出我的问题的一个示例,当然,创建一个我永远不会创建和使用这样的函数的程序;)
        【解决方案4】:

        要将字符转换为(以空结尾的)字符串,您可以简单地执行以下操作:

        char* ctos(char c)
        {
            char s[2];
            sprintf(s, "%c\0", c);
            return s;
        }
        

        工作示例:http://ideone.com/Cfav3e

        【讨论】:

        • 不起作用,因为c 仍然是char 类型。 sprintf 期望使用字符串。
        • 这似乎有效,实际上。如果sprintf 在格式字符串中填写%c,则可以接受字符参数。
        • 这是一种很好的转换方式,但是:(1) 你返回的是一个局部变量,它应该真的崩溃了,(2) 必须省略格式字符串中嵌入的 NUL。
        猜你喜欢
        • 1970-01-01
        • 2019-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多