【发布时间】:2012-10-22 02:10:49
【问题描述】:
我正在尝试使用表示整数的 char 来制作 char *。 所以到目前为止我有这个
int x;
for(x=0;x<12;x++){
cp->name=strcat(tp->name, (char *)x);
}
名字是字符* 问题是 x 部分。我得到分段错误,我假设这是因为它无法访问地址 x 的内容并将其转换为 char *
这方面有什么建议吗?
谢谢
【问题讨论】:
我正在尝试使用表示整数的 char 来制作 char *。 所以到目前为止我有这个
int x;
for(x=0;x<12;x++){
cp->name=strcat(tp->name, (char *)x);
}
名字是字符* 问题是 x 部分。我得到分段错误,我假设这是因为它无法访问地址 x 的内容并将其转换为 char *
这方面有什么建议吗?
谢谢
【问题讨论】:
通过将x 转换为char *,您是在告诉编译器,“我知道我在做什么。将x 视为地址并将其传递给strcat”
因为x 包含一个介于0 和12 之间的整数,strcat 正试图访问位于该数字地址的字符数组。因为内存中的那个地址很可能不属于你,所以你遇到了段错误。
您需要sprintf 或snprintf 来获取整数的字符串表示形式。
例如:
int x;
for(x=0;x<12;x++){
char buffer[16];
snprintf(buffer, sizeof(buffer), "%d", x);
cp->name=strcat(tp->name, buffer);
}
【讨论】:
您需要将x 中的数字显式转换为字符串(=chars 的数组)。你不能仅仅通过类型转换来做到这一点。
使用sprintf() 可能是最简单的方法:
int x;
for (x = 0; x < 12; x++)
sprintf(tp->name + strlen(tp->name), "%d", x);
不用说,tp->name 中必须有足够的空间,并且必须在执行上述操作之前将其终止为'\0'。
【讨论】:
tp->name,如果 tp->name 最初包含“tp”,则会产生类似“tp123456789101112”的内容。
在C语言中,你可以使用sprintf(str,"%d",x);或在 C++ 字符串流std::ostringstream oss; oss << tp->name << x; 中。如果你对使用非标准函数没有疑虑,你也可以使用非标准的itoa()函数。
【讨论】: