Простой ответ
$p = 1234567;
$p = sprintf("%08d",$p);
Я не уверен, как интерпретировать комментарий, говорящий «Он никогда не будет более 8 цифр», и если он ссылается на ввод или вывод. Если это относится к выходу, у вас должен быть дополнительный вызов substr () для обрезания строки.
Чтобы скопировать первые 8 цифр
$p = substr(sprintf('%08d', $p),0,8);
Чтобы закрепить последние 8 цифры
$p = substr(sprintf('%08d', $p),-8,8);
Вы можете сделать это с любым типом данных. Просто сделайте это указателем на указатель:
typedef struct {
int myint;
char* mystring;
} data;
data** array;
. Но не забывайте, что вам все равно придется изменять malloc, и он становится немного сложным:
//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array
//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);
//iterate over 'y' dimension
for(y=0;y<h;y++){
//malloc the 'x' dimension
array[y] = malloc(sizeof(data) * w);
//iterate over the 'x' dimension
for(x=0;x<w;x++){
//malloc the string in the data structure
array[y][x].mystring = malloc(50); //50 chars
//initialize
array[y][x].myint = 6;
strcpy(array[y][x].mystring, "w00t");
}
}
Код для освобождения структуры выглядит аналогичным - не забудьте позвонить бесплатно () на все, что вы malloced! (Кроме того, в надежных приложениях вы должны проверить возврат malloc () .)
Теперь предположим, что вы хотите передать это функции. Вы все равно можете использовать двойной указатель, потому что вы, вероятно, хотите сделать манипуляции с структурой данных, а не указателем на указатели структур данных:
int whatsMyInt(data** arrayPtr, int x, int y){
return arrayPtr[y][x].myint;
}
Вызовите эту функцию с помощью:
printf("My int is %d.\n", whatsMyInt(array, 2, 4));
Выход:
My int is 6.
Передайте явный указатель на первый элемент с размерами массива в виде отдельных параметров. Например, для обработки 2-мерных массивов произвольного размера для int:
void func_2d(int *p, size_t M, size_t N)
{
size_t i, j;
...
p[i*N+j] = ...;
}
, который будет называться как
...
int arr1[10][20];
int arr2[5][80];
...
func_2d(&arr1[0][0], 10, 20);
func_2d(&arr2[0][0], 5, 80);
. Этот же принцип применяется для массивов больших размеров:
func_3d(int *p, size_t X, size_t Y, size_t Z)
{
size_t i, j, k;
...
p[i*Y*Z+j*Z+k] = ...;
...
}
...
arr2[10][20][30];
...
func_3d(&arr[0][0][0], 10, 20, 30);
int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix
{
return p[0][0];
}
int main()
{
int *u[5]; // will be a 5x5 matrix
for(int i = 0; i < 5; i++)
u[i] = new int[5];
u[0][0] = 1; // initialize u[0][0] - not mandatory
// put data in u[][]
printf("%d", matmax(u, 0)); //call to function
getche(); // just to see the result
}
Вы можете объявить свою функцию как:
f(int size, int data[][size]) {...}
Затем компилятор выполнит всю арифметику указателя для вас.
Обратите внимание, что размеры размеров должны отображаться перед самим массивом.
GNU C разрешает переадресацию объявлений аргументов (в случае, если вам действительно нужно передать размеры после массива):
f(int size; int data[][size], int size) {...}
Первое измерение, хотя вы также можете передать аргумент, бесполезно для компилятора C (даже для оператора sizeof при применении к массиву, переданному как аргумент, всегда будет рассматриваться как указатель на первый элемент).
data
в моей main (), если я не знаю размеров? Я пытался с int* data
, но не сработал.
– Glk-78
27 August 2017 в 11:30
[][]
, он не волшебным образом превращается в массив. Вы не можете memcpy () и т. Д., Потому что память не выделяется в смежных ячейках памяти, что требуется для массивов. Ваша таблица поиска довольно разбросана по всей куче, делая поиск медленным, а куча фрагментирована. – Lundin 23 June 2015 в 10:42