5

我的问题是将字符转换为字符串,我必须将字符传递给 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;
}
4

4 回答 4

5

由于ok指向一个未初始化的字符数组,它都是垃圾值,所以连接 (by 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;
}
于 2010-02-27T13:26:00.127 回答
3

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++,因此*是无用的。

于 2010-02-27T13:28:19.690 回答
2

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

  • 没有函数原型。
  • 指针的错误使用
  • 处理strcat函数使用不当。
  • 过度使用 - 不需要asd函数本身!
  • 处理变量的用法,尤其char是未正确初始化的数组。
#include <stdio.h>
#include <string.h>

诠释主要(){
    字符 st[] = "文本";
    字符确定[200];
    好的[0] = '\0'; /* 或者
    memset(ok, 0, sizeof(ok));
    */
    strcat(ok, st);
    printf("%s", ok);
    返回0;
}

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-27T13:30:50.250 回答
0

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

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

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

于 2014-02-01T23:27:26.537 回答