[英]Build a string (char pointer) from an integer array
我正在做一个作业,要求我从 integer 的矩阵中构建一个字符串(以某种方式,不是这个问题的重点)。 字符串必须是 char 指针。
我的代码如下
void funcMatrix(int *matrix, int rows, int columns, char* outBuffer)
{
int j,i;
int element =0;
for (i = 0; i < rows; ++i)
{
for (j = 0; j < columns; ++j)
{
malloc(sizeof(matrix[(i * columns) + j]));
sprintf(outBuffer + (element++),"%d", matrix[(i * columns) + j]);
}
}
}
对于矩阵
{{ 3, 8},
{ 7, 12},
{ 0, 10} };
outBuffer应该是38712010但我的代码打印3871010 (因为它从 12 中取 1 位)
请问我该如何解决? 我被困住了
理想情况下,我需要 3、8、7、12、0、10
问题是您再次覆盖了已经写入的数字!
数字 12 需要多少位数? 你的指针前进了多少位?
处理此问题的最安全方法是使用sprintf
function 的结果,这是它写入的字节数(不包括终止 null 字符):
element += sprintf(outBuffer + element, "%d", matrix[i * columns + j]);
我个人更喜欢使用指针:
// char* ob = outBuffer;
// actually, we don't even need that one, we do not reuse the parameter
// itself afterwards anyway, so we can simply move that one:
outBuffer += sprintf(outBuffer, "%d", matrix[i * columns + j]);
此外,我还建议提供缓冲区大小,这有助于防止写入超出其范围:
void funcMatrix
(
int *matrix, int rows, int columns, char* outBuffer, size_t bufferSize
)
{
// ...
int num = snprintf(outBuffer, bufferSize, "%d", matrix[i * columns + j];
// ^
outBuffer += num;
bufferSize -= num;
// ...
}
对于初学者,function 的声明
void funcMatrix(int *matrix, int rows, int columns, char* outBuffer);
没有意义。
由于您的矩阵被解释为一维数组,因此无需将数组中的元素总数拆分为行数和列数,因为您可以调用 function 之类的
funcMatrix( matrix, rows * columns, outBuffer );
也就是说 function 只能有三个参数。
由于数组矩阵在 function 中没有被更改,因此应使用限定符const
声明相应的参数。
如果矩阵可能没有负数,则其元素类型应为 unsigned int 类型。 否则,您还需要 output 负数的减号,或者编写代码使其忽略减号。
此语句与 memory 分配
malloc(sizeof(matrix[(i * columns) + j]));
没有意义,因为没有使用返回的值。 因此该语句的唯一影响是 memory 泄漏。
由于矩阵中的数字可以包含多个数字,因此此表达式
sprintf(outBuffer + (element++),"%d", matrix[(i * columns) + j]);
^^^^^^^^^^^
一般是不正确的。
function 可以如下面的演示程序所示。
#include <stdio.h>
#include <stdlib.h>
size_t total_numbers_length( const unsigned int a[], size_t n )
{
const int Base = 10;
size_t length = 0;
for ( size_t i = 0; i < n; i++ )
{
unsigned int value = a[i];
do
{
++length;
} while ( value /= Base );
}
return length;
}
char * fill_string_from_array( char *buffer, const unsigned int *a, size_t n )
{
for ( char *p = buffer; n-- ; )
{
int offset = sprintf( p, "%u", *a++ );
if ( offset <= 0 ) break;
else ( p += offset );
}
return buffer;
}
int main(void)
{
unsigned int a[] = { 3, 8, 7, 12, 0, 10 };
const size_t N = sizeof( a ) / sizeof( *a );
char *buffer = malloc( total_numbers_length( a, N ) + 1 );
if ( buffer )
{
puts( fill_string_from_array( buffer, a, N ) );
}
free( buffer );
return 0;
}
程序 output 是
38712010
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.