2015-09-24 2 views
0

Я пытаюсь распечатать двухмерный массив строк, используя приведенный ниже массив, и сопоставить каждую фразу числом от 0 до 3. Когда я пытаюсь распечатать каждую фразу, слова совпадают и распечатываются неправильно.Как напечатать двухмерный массив строк (с пробелами) в C?

char PhraseList[4][10]= {" Work Hard","Play Hard ","Enjoy","Live"}; 

Как я могу распечатать каждую фразу на отдельной строке, так что «Трудолюбивый» печатает на одной линии, то «Play Hard» на другую линию, а затем «Enjoy» на другой и т.д. Кроме того, как я могу ассоциировать каждую фразу с номером? Любая помощь \ предложения будет принята с благодарностью!

Вот мой код:

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 



int main() 
{ 
char PhraseList[4][10]= {" Work Hard","Play Hard ","Enjoy","Live"}; 

int i; 

for(i=0; i<4; i++) 
{ 
    printf("%s \n", PhraseList[i]); 
} 


printf("\n\n"); 
system("PAUSE"); 
return 0; 
} 

Выход:

Work HardPlay Hard Enjoy 
Play Hard Enjoy 
Enjoy 
Live 


Press any key to continue . . . 

+1

Почему у вас есть начальное и конечное пространство в первой и второй строковой записи? Это намеренно? Если это так, вам нужно увеличить размер второго измерения массива. – CinCout

+1

Off-topic: если вы действительно хотите использовать 'system (" pause ")', то почему бы не использовать 'system (« echo Work Hard »)' (и т. Д.)? – usr2564301

ответ

3

Ваши printf звонки отлично. Реальная проблема в том, что вы переполняете буфер. Каждой строке дано 10-байтовое максимальное хранилище. Но в C строк по определению NUL завершено. Так что вам нужен дополнительный байт, чтобы сохранить это NUL.

Лучше не указывать фиксированный размер вообще. Может просто сделать это:

const char *PhraseList[]= {" Work Hard","Play Hard ","Enjoy","Live"}; 
3

Как было отмечено в комментарии, ведущих и хвостовых пробелов в «Work Hard» и «Play Hard» соответственно является причиной проблемы.

Размер каждого из них - 11 символов (не 10).

" '[space]' 'W' 'o' 'r' 'k' '[space]' 'h' 'a' 'r' 'd' '\0'" 

, что составляет 11 символов.

Таким образом увеличить размер PhraseList и объявить его как

char PhraseList[4][11]= {" Work Hard","Play Hard ","Enjoy","Live"}; 

или

const char *PhraseList[]= {" Work Hard","Play Hard ","Enjoy","Live"}; 
0

Вы выделяете слишком мало памяти для строк.

Давайте посмотрим «Work Hard». В памяти эта строка хранится как '', 'W', 'o', 'r', 'k', '', 'H', 'a', 'r', 'd', '\ 0', ' то есть в нем требуется 11 байтов.

Но вы выделяете только 10 байтов. Измените тип на PhraseList[4][11].

0

Вы можете либо избавиться от своих ведущих и задних белых пространств, либо сделать массив более крупным. Если вы хотите вывести Number, связанный с массивом, просто добавьте переменную i к вашему выводу.

int main() 
{ 
char PhraseList[4][10] = { "Work Hard","Play Hard","Enjoy","Live" }; 

int i; 

for (i = 0; i<4; i++) 
{ 
    printf("%d %s \n", i, PhraseList[i]); 
} 

printf("\n\n"); 
system("PAUSE"); 
return 0; 
} 
0
  • Первого решения:

  • Просто удалить пространство из первого и второго string.Because вашего массива он exceded длины araay строки.

  • Второе решение:

  • Просто увеличить размер строки вашего массива,

  • Вместо этого

    char PhraseList[4][10] = { " Work Hard","Play Hard ","Enjoy","Live" }; 
    
  • Объявите это так,

    char PhraseList[4][15] = { " Work Hard","Play Hard ","Enjoy","Live" }; 
    
+0

почему 15? * просто потому, что минимальная длина комментария SO составляет 15 символов *? : P – CinCout

+0

Я предложил 15 в соответствии с этим кодом. Это зависит от требований ур или длины строки. –

+0

И как именно этот код требует 15? Не будет 11 делать? – CinCout

Смежные вопросы