1

我有一个如下所示的代码,最后一条语句只有在我使用 l_plates[i] 时才有效。在下面的情况下,它会抛出一个错误“传递 'sprintf' 的参数 1 使指针从整数而不进行强制转换” 如果我也需要另一个用于 N 的 for 循环怎么办。如果我使用 sprintf,我应该使用额外的元素吗?请解释。提前致谢。

char type, letters[4], digits[5];
char l_plates[M][N];

for (i=0; i<M; i++) {
    scanf(" %c", &type);
    scanf("%3s", letters); 
    scanf("%4s", digits); 
    sprintf(l_plates[i][N], "%s %s %c", letters, digits, type);
}
4

5 回答 5

4

我在这里看到两个问题。首先, sprintf 的第一个参数应该是 a char*,而不是 a char,这是您发送给它的内容。

其次,一个大小数组的N索引从0N - 1。通过尝试访问 element N,您正在走出数组。最后一个元素是[N - 1].

于 2013-04-05T01:35:40.363 回答
0

在您的sprintf行中,表达式l_plates[i][N]指的是单个字符,并且您正在尝试向其写入整个字符串。

该变量l_plates是长度字符串的一维数组N(或字符的二维数组)。

如果您需要一个二维字符串数组,那么您需要使用以下内容进行定义l_plates

char* l_plates[M][N];

然后相应地 malloc那些字符串。

于 2013-04-05T01:34:45.480 回答
0

让我们看一下 的声明l_plates

字符 l_plates[M][N];

这表示这l_plates是一个字符数组的N数组M。另一种理解方式是将其视为二维字符数组。

那么是什么类型的l_plates[i][N]呢?这是一个char!换句话说,它是一个单一的符号。但是,sprintf()需要 achar*作为它的第一个参数。这就是为什么您的上述代码会出现编译器错误。

另一方面l_plates[i]是s的数组charC 和 C++ 都可以将此数组转换为 a char*,因此编译器不会抱怨。

于 2013-04-05T01:36:42.583 回答
0

这是因为l_plates[i]它是一个字符串,而l_plates[i][N]它是一个字符,尽管它是一个越界字符(因为N-1是最后一个字符)。

也就是说,您可能会更好snprintf()

snprintf(l_plates[i], N, "%s %s %c", letters, digits, type);

这可以确保你不会溢出你的字符数组。

于 2013-04-05T01:37:12.837 回答
0

您应该查看指针和数组在 C 中的工作方式。

l_plates[i][N]实际上是指 a char,所以它甚至不会编译;sprintf 期望char*它写入输出的位置。l_plates[i]具有 type char[N],可隐式转换为char*,指向内部数组的开头。将其作为 sprintf 的参数使其执行您可能想要的操作。

顺便说一句,l_plates[i][N]您正在以非法偏移量访问内部数组。大小为 N 的数组的偏移量应在 0 到 N-1 之间。C/C++ 不一定会在运行时抱怨这一点,但它几乎总是一个错误。在这种情况下l_plates[M-1][N],确实指向分配给l_plates.

于 2013-04-05T01:43:19.440 回答