我在C中分配一个字符串变量有一个小问题。假设我们有char string[100]
,我想为这个变量分配一个带整数的字符串,就像在这里一样。
我试过的是......
strcpy(string, "The tile in %d,%d is occupied: ", row, col);
但是我收到了一个错误
未解析的外部符号消息。
有没有其他方法可以做到这一点?
char string[100];
sprintf(string, "The tile in %d,%d is occupied: ", row, col);
您必须了解的是,像"The tile in %d,%d is occupied: ", row, col
这样的构造不是C语言的一些“神奇”构造,它始终适用于字符串。您可能会想到这一点的原因是,大多数初学者指南和书籍都不在乎,像printf("You name is %s", name)
这样的线路实际上是什么。
这不是C语言的神奇之处,它是printf
(以及整个print
,scanf
系列函数)首先设计的方式。
在C中,字符串"Your name is Mike"
和"Your name is %"
只是两个字符串(一系列以\0
结尾的字符),第二个字符串并不比C视角中的第一个字符串更特殊。 C语言还有一个特殊功能(有些称之为省略号),允许您传递未定义的参数。
看看这个:
void foo(int a, int b);
有了这个声明,只有一种方法可以调用foo
:过于争论。但是,如果foo
被宣布为
void foo(int a, int b, ...);
然后你可以这样打电话给foo:
struct something k;
foo(1,2);
foo(1,2,3,4,5,6,7);
foo(2, 3, "This is a string", k, &k);
使用va_list
(变量参数列表)foo
可以访问传递给它的其余参数,这些参数位于最后一个命名参数之后,在本例中为b
。
printf
是一个允许这种灵活性的函数,你可以用许多参数调用printf
(总是至少有一个)。
// man 3 printf
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int dprintf(int fd, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
如您所见,所有这些功能都以这种方式声明。 printf
工作的基本方式是它读取第一个参数并解析它。当它遇到像%d
这样的子字符串时,它知道用户已经传递了一个整数。它使用va_list
检索整数并打印整数的值而不是%d
。然后继续直到它到达格式字符串的末尾,始终用使用%
检索的值替换va_list
s。
strcpy
被声明为char *strcpy(char *dest, const char *src);
,它没有像printf
那样使用“椭圆技巧”,所以你的行是错的,编译器抱怨它。
还有其他函数使用与printf
类似的策略,但绝大多数函数接受字符串都没有实现这个“技巧”。对于那些情况,你可以使用sprintf
。