Проблема программирования указателей на C и массивов 2d - PullRequest
0 голосов
/ 09 ноября 2018

Q2: Реализация следующей функции ArrPrintMatrix(char *(p)[7]), которая печатает содержимое матрицы matrix[m][7] ={"SHAHBAZ","AYAZ"} в 3x3

Пример вывода

S H A                      
H B A                       
Z A Y ..

Мой вопрос: здесь проблема только в коде, которую я получаю, это пробел после одного имени ... как убрать этот пробел. У меня есть этот вопрос в моих заданиях, которые должны быть представлены в воскресенье (11-11-18) .. Мой код:

#include<stdio.h>
int main()
{
    void ArrPrintMatrix(char *p);//function declaration
    char matrix[2][8] ={"SHAHBAZ","AYAZ"};//2d array initiliation
    ArrPrintMatrix(&matrix[0][0]);//calling function with base address

}

void ArrPrintMatrix(char *p)
{
    int i;
    for(i=0;i<16;i++)
    {
        if(i>=9)//since 3 by 3 matrix is required
            break;
        if(i==3||i==6||i==9)//changing line since 3 by 3 matrix is needed
            printf("\n");
        printf("%c ",*(p+i));//prininting chracters

    }
}

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Чего вам не хватает, так это того, что в конце SHAHBAZ есть конечный '\0', который вы также «печатаете», но поскольку '\0' не имеет символьного представления, вы видите то, на что похоже «дополнительный» пробел.

Вот наименьшее изменение, которое я могу придумать для решения именно этой проблемы; добавить:

if (*(p+i)==0) continue; //don't try to print the trailing '\0'

чуть выше существующей линии:

printf("%c ",*(p+i));//prininting chracters

Выход:

S H A 
H B A 
Z A 

Есть и другие вещи, которые я бы сделал по-другому, чем то, как вы их делаете, но это решает ваш точный вопрос, используя ваш стиль кодирования.

0 голосов
/ 09 ноября 2018

В качестве продолжения моего другого ответа, если вы используете мою логику, чтобы пропустить '\0', который завершает строки, вам нужно будет использовать другую переменную, чтобы отслеживать, сколько символов вы на самом деле напечатано, и просто позвольте i отслеживать, где вы находитесь во входных строках. Вот так:

#include<stdio.h>
int main()
{
    void ArrPrintMatrix(char *p);//function declaration
    char matrix[2][8] ={"SHAHBAZ","AYAZ"};//2d array initiliation
    ArrPrintMatrix(&matrix[0][0]);//calling function with base address

}

void ArrPrintMatrix(char *p)
{
    int i, j;
    for(i=0, j=0;i<16;i++)
    {
        if(j>=9)//since 3 by 3 matrix is required
            break;
        if(j==3||j==6||j==9)//changing line since 3 by 3 matrix is needed
            printf("\n");
        if (*(p+i)==0) continue; //don't try to print the trailing '\0'
        printf("%c ",*(p+i));//prininting chracters
        j++; //increment counter of characters actually printed

    }
}

Выход:

S H A 
H B A 
Z A Y 

Обратите внимание на использование переменной j и на то, как она увеличивается с j++ только после фактической печати символа.

0 голосов
/ 09 ноября 2018

Вы должны использовать char (*p)[8], а не char* p

Может произойти следующее code:

#include<stdio.h>
int main()
{
    void ArrPrintMatrix(char (*p)[8]);//function declaration
    char matrix[2][8] ={"SHAHBAZ","AYAZ"};//2d array initiliation
    ArrPrintMatrix(matrix);//calling function with base address

}
void ArrPrintMatrix(char (*p)[8])
{
    // i will point to one of the strings in the set of strings
    // j will point into the string we are inspecting
    // k will count how many characters we have printed
    int i = 0, j = 0, k = 0;

    // we only need to print the first 9 printable characters we find
    while (k != 9)
    {
        // if we have reached the end of an input string (the null-terminator),
        // then move on to the next element in the array, and reset
        // the string pointer to the beginning of the new string
        if (p[i][j] == '\0') {
            ++i;
            j = 0;
        }

        // print the character we are now pointing at,
        // and increment the string pointer
        printf("%c ", p[i][j++]);

        // keep count of how many characters we have printed
        ++k;

        // if k is divisible by 3, start a new row
        if(k%3 == 0)
            printf("\n");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...