2016-03-11 3 views
0

Как напечатать элементы двумерного массива символов в C?C - Печать двумерного массива символов

Вот мой текущий код:

int main() 
{ 
    unsigned int size; 

    printf("Enter size:\n"); 
    scanf("%d",&size); 

    char word[size][size]; 

    //Enter the matrix 
    for(int k = 0; k < (size); ++k){ 
    for (int j = 0; j < (size); ++j){ 
     printf("Enter letter:"); 
     scanf("%c",&word[k][j]); 
    } 
    } 

    //printf("\n"); 
    for (int k = 0; k < size; ++k){ 
    for(int j = 0; j < size; ++j){ 

     printf("%c",word[k][j]); 
    } 
    //printf("\n "); 
    } 
    printf("\n"); 
} 

При выполнении он возвращает элемент в пар (с использованием 4x4 массив) Пример:

ab 
cd 
ef 
gh 
ij 
kl 
mn 
op 

Вместо того, чтобы мой желаемый результат:

abcd 
efgh 
ijkl 
mnop 

Почему это?

+2

Добро пожаловать в переполнение стека! Похоже, вам, возможно, потребуется научиться использовать отладчик для выполнения вашего кода.С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+3

Вы явно не печатаете новые строки до самого конца, поэтому остальные из них, вероятно, поступают с вашего ввода. Вы вводите все значения в одной строке перед нажатием клавиши ввода? Если нет, то 'scanf' будет хранить символы новой строки в' word'. –

+0

использовать спецификатор формата% u для unsigned int –

ответ

3

изменения вашего зсапЕ решает все проблемы

scanf(" %c",&word[k][j]); // notice the space before '%c' 

А также вам нужно изменить цикл печати для этого

for (k = 0; k < size; ++k){ 
    for(j = 0; j < size; ++j){ 
     printf("%c",word[k][j]); 
    } 
    printf("\n"); 
} 
0

Осторожно: %c и %1s делать разные вещи (за исключением добавления заканчивающуюся null для последнего):

  • c принимают каждый символ включая пробел, табуляция, кр Л.Ф.
  • %1s перескочить через все пробелы (пробел, табуляция, CR, LF и т.д.)

Так во время ввода, вы должны использовать:

char c[2]; // provide room for a terminating null... 
... 
for(int k = 0; k < (size); ++k){ 
    for (int j = 0; j < (size); ++j){ 
     printf("Enter letter:"); 
     scanf("%1s",c); 
     word[k][j] = c[0]; 
    } 
} 

и во время печати:

for (int k = 0; k < size; ++k){ 
    for(int j = 0; j < size; ++j){ 
     printf("%c",word[k][j]); 
    } 
    printf("\n "); // new line after each line 
} 
1

Я снял чтение и, похоже, печать в порядке:

int main() 
{ 
    const unsigned int size = 4; 
    char word[size][size]; 

    //Enter the matrix 
    for (int k = 0; k < (size); ++k) { 
     for (int j = 0; j < (size); ++j) { 
      word[k][j] = 'a' + j + (k * size); 
     } 
    } 

    for (int k = 0; k < size; ++k) { 
     for (int j = 0; j < size; ++j) { 

      printf("%c", word[k][j]); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 

    getchar(); 
    return 0; 
} 

И выход:

abcd 
efgh 
ijkl 
mnop 
1

Я нашел две проблемы с вашим источником.

Одним из них является распределение памяти - это фактически не ansi-c.

Если вам нужна динамическая память, вам необходимо выделить ее во время выполнения. Рассмотрите возможность перехода на C++, поскольку есть стандартные средства, которые помогают с этим безопаснее.

Вторая проблема заключалась в том, что в буфере есть символ пробела, который используется в качестве входного символа. Я думаю, вы хотите это понять.

Вот источник с дополнительными комментариями:

#include <stdio.h> 
#include <stdlib.h> 

void ansiC() 
{ 
    unsigned int size; 

    printf("Enter size:\n"); 
    scanf("%d", &size); 

    //char word[size][size]; <- this is not ansi-c because size is unknown at compile time 
    char * word = (char*)malloc(sizeof(char)* size * size); 


    //Enter the matrix 
    for (int k = 0; k < (size); ++k) 
    { 
     for (int j = 0; j < (size); ++j) 
     { 
      printf("Enter letter:"); 
      scanf("%c ", &word[k * size + j]); 
      //since word is just a pointer i changed the way the position is calculated 
      //after the character the user presses the enter key 
      //this puts a whitespace character on the buffer. 
      //by adding the space after %c you also clear that from the buffer 
     } 
    } 

    //printf("\n"); 
    for (int k = 0; k < size; ++k) 
    { 
     for (int j = 0; j < size; ++j) 
     { 

      printf("%c", word[k * size + j]); 
      //since word is just a pointer i changed the way the position is calculated 
     } 
     //printf("\n "); 
    } 
    printf("\n"); 

    free(word); //if you use malloc you need to remember to use free 
} 

int main() 
{ 
    ansiC(); 
    return 0; 
} 
+0

Я ценю этот ответ, содержащий указатели. Это помогло мне лучше понять их! благодаря – robinhood46

0

Пожалуйста, проверьте это.

# include <iostream.h> 
# include <conio.h> 


void main() 
{ 
clrscr(); 
char arr[5][3]={"abc","aks","tny","dkn","kbf"}; 
    for(int a=0;a<5;a++) 
    { 
     for(int b=0;b<3;b++) 
     { 
      cout<<" "<<arr[a][b]; 
     } 
     cout<<endl; 
    } 


getch(); 
}