将整数值分配给C中的字符串

问题描述 投票:-4回答:2

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

我试过的是......

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

但是我收到了一个错误

未解析的外部符号消息。

有没有其他方法可以做到这一点?

c
2个回答
3
投票
 char string[100];
 sprintf(string, "The tile in %d,%d is occupied: ", row, col);

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可以访问传递给它的其余参数,这些参数位于最后一个命名参数之后,在本例中为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_lists。

strcpy被声明为char *strcpy(char *dest, const char *src);,它没有像printf那样使用“椭圆技巧”,所以你的行是错的,编译器抱怨它。

还有其他函数使用与printf类似的策略,但绝大多数函数接受字符串都没有实现这个“技巧”。对于那些情况,你可以使用sprintf

© www.soinside.com 2019 - 2024. All rights reserved.