为C

时间:2017-12-24 20:21:35

标签: c

我在C中分配一个字符串变量有一个小问题。让我们说char string[100]我想要为这个变量分配一个带整数的字符串,就像在这里一样。

我尝试的是......

strcpy(string, "The tile in %d,%d is occupied: ", row, col);

但是我收到了错误

  

未解析的外部符号消息。

我还有其他办法吗?

2 个答案:

答案 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 (以及整个printscanf函数族)的方式的地方。

在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