Не знаете, почему sed
не работает, но вы можете использовать tr
вместо
$ echo 'abcABC123' | tr -d 'A-Z'
abc123
Из man tr
tr - перевести или удалить символы
-d, --delete удалить символы в SET1, не переводить
blockquote>
char **
не представляет собой 2D-массив - это будет массив указателей на указатели. Вам нужно изменить определение printarray
, если вы хотите передать ему 2D-массив:
void printarray( char (*array)[50], int SIZE )
или эквивалентно:
void printarray( char array[][50], int SIZE )
В main () переменная «array» объявлена как
char array[50][50];
Это 2500-байтовый фрагмент данных. Когда main () 's array' передается около, это указатель на начало этих данных. Это указатель на char, который, как ожидается, будет организован в строках из 50.
Однако в функции printarray () вы объявляете
char **array
«array» здесь указатель на «указатель char».
@ Предложение Lucus «void printarray (char array [] [50], int SIZE)» работает, за исключением того, что не является общим в том, что ваш параметр SIZE must равно 50.
Идея: поражение (yeech) тип массива параметров в printarray ()
void printarray(void *array, int SIZE ){
int i;
int j;
char *charArray = (char *) array;
for( j = 0; j < SIZE; j++ ){
for( i = 0; i < SIZE; i ++){
printf( "%c ", charArray[j*SIZE + i] );
}
printf( "\n" );
}
}
Более элегантным решением является создание массива "в main () массив указателей.
// Your original printarray()
void printarray(char **array, int SIZE ){
int i;
int j;
for( j = 0; j < SIZE; j++ ){
for( i = 0; i < SIZE; i ++){
printf( "%c ", array[j][i] );
}
printf( "\n" );
}
}
// main()
char **array;
int SIZE;
// Initialization of SIZE is not shown, but let's assume SIZE = 50;
// Allocate table
array = (char **) malloc(SIZE * sizeof(char*));
// Note: alternative syntax
// array = (char **) malloc(SIZE * sizeof(*array));
// Allocate rows
for (int row = 0; row<SIZE; row++) {
// Note: sizeof(char) is 1. (@Carl Norum)
// Shown here to help show difference between this malloc() and the above one.
array[row] = (char *) malloc(SIZE * sizeof(char));
// Note: alternative syntax
// array[row] = (char *) malloc(SIZE * sizeof(**array));
}
// Initialize each element.
for (int row = 0; row<SIZE; row++) {
for (int col = 0; col<SIZE; col++) {
array[row][col] = 'a'; // or whatever value you want
}
}
// Print it
printarray(array, SIZE);
...
Вы можете легко передать 2d-массив, используя двойной указатель.
void printarray( char **array, int n)
{
int i, j;
for(i=0; i<n; i++ )
{
for(j=0; j<n; j++)
{
printf("%c ", array[i][j] );
}
printf( "\n" );
}
}
int main()
{
int n = 2;
int i, j;
char **array = (char **) malloc(n * sizeof(char*));
for (i=0; i<n; i++)
{
array[i] = (char *) malloc(n* sizeof(char));
}
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
scanf("%c ", &array[i][j]);
}
}
printarray(array, n);
return 0;
}
Полный код: Ideone
Так как C99 поддерживает массивы с динамическим размером, следующий стиль просто более удобен для пропускания 2-мерного массива:
void printarray( void *array0, int SIZE ){
char (*array)[SIZE] = array0;
int i;
int j;
for( j = 0; j < SIZE; j++ ){
for( i = 0; i < SIZE; i ++){
printf( "%c ", array[j][i] );
}
printf( "\n" );
}
}