我在C中分配一个字符串变量有一个小问题。让我们说char string[100]
我想要为这个变量分配一个带整数的字符串,就像在这里一样。
我尝试的是......
strcpy(string, "The tile in %d,%d is occupied: ", row, col);
但是我收到了错误
未解析的外部符号消息。
我还有其他办法吗?
答案 0 :(得分:3)
char string[100];
sprintf(string, "The tile in %d,%d is occupied: ", row, col);
答案 1 :(得分:0)
你必须要理解的是,像"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
可以访问传递给它的其余参数在最后命名的参数之后,在这种情况下{{1} }}
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
。然后继续直到它到达格式 -String的末尾,始终用%d
检索的值替换%
。
va_list
被声明为strcpy
,它不会像char *strcpy(char *dest, const char *src);
那样使用“椭圆技巧”,所以你的行是错的,编译器就会抱怨它。
还有其他函数使用与printf
类似的策略,但绝大多数函数接受字符串都没有实现这个“技巧”。对于这些情况,您可以使用printf
。