2015-05-19 4 views
-3

Я пытаюсь напечатать простой 2D массив строки взять строки из пользователя и распечатать егоC: формат «% s» ожидает аргумент типа «символ *», но аргумент 2 имеет тип «символ **»

void in(char* n[3][2]); 
void show_name() 
{ 
    char* n[3][2]; 
    in(n); 
    unsigned int i,j; 
    for(i=0;i<3;i++) 
    { 
     for(j=0;j<2;j++) 
      printf("%s ", &n[i][j]); 
     printf("\n"); 
    } 
} 

int main(void) 
{ 
    show_name(); 
    return 0; 
} 
void in(char* n[3][2]) 
{ 

    int i,j; 
    for(i=0;i<3;i++) 
     for(j=0;j<2;j++) 
      scanf("%s",&n[i][j]); 

    printf("\n"); 
} 

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

предупреждение: формат '% s' ожидает аргумент типа 'символ *', но аргумент 2 имеет тип 'символ **' [-Wformat] |

я искал причины я обнаружил, что проблема в %s не нужно для адреса когда я удалить & оператора нет предупреждения там `но код не работает правильно

+5

Я думаю, что предупреждение должно быть довольно очевидно. –

+0

не нужно char * n [3] [3] в show_name(), используйте void in (char ** n) и вызывайте его как в (n); – Subinoy

+2

Здесь много неправильного: * вы не проверяете размер ввода, что делает возможным пересылку буфера * вы, скорее всего, захотите сканировать в 3 строки, но вызовите scanf 6 раз. – mfuchs

ответ

1

Я упростил и исправлениями ваша программа, комментируя, где я ее изменил.

EDIT как сделать его легко изменить количество строк, теперь 6, как описано выше комментарии

#include <stdio.h> 

#define STRINGS 6 

void in(char n[][200]);   // no need for * and array 

void show_name() 
{ 
    char n[STRINGS][200] = {}; // allow some string space and init for security 
    int i; 
    in(n); 
    for(i=0; i<STRINGS; i++) // only need to iterate one dimension 
     printf("%s\n", n[i]); 
} 

int main(void) 
{ 
    show_name(); 
    return 0; 
} 

void in(char n[][200])   // needs length of each row, but not number of rows 
{ 
    int i; 
    for(i=0; i<STRINGS; i++) // only need to iterate one dimension 
     scanf("%199s", n[i]); // restrict the input length 
    printf("\n"); 
} 
+0

какая разница между ним и массивом 1D? –

+0

отредактируйте свой код и удалите оператор '&', потому что он все равно дает тот же самый ворон. –

+0

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

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