2016-06-20 7 views
1

Я хочу сканировать строку и указать указатель char на эту отсканированную строку.scanf строка в указателе char

int main(int argc, char *argv[]) { 

    char *string; 
    scanf("%s",&string); 
    printf("%s\n",string); 

} 

Но выдает предупреждение о том,

предупреждение: формат '% S' ожидает аргумент типа 'символ *', но аргумент 2 имеет тип 'символ **'

Как сканировать строку в char * без предупреждений.

Редактировать: Он работал с приведенным ниже кодом с предупреждениями, и я развернул его до указанного выше, чтобы быть очень конкретным.

int main(int argc, char *argv[]) { 

    int n = 2; 

    char *strings[2]; 
    for(int i = 0; i < n; i++){ 
     scanf("%s",&strings[i]); 
     printf("%s\n",&strings[i]); 
    } 

} 

enter image description here

+1

Выделить память для строковой переменной, а затем передать только 'string' вместо' & string'. – Jeyaram

+0

Другими словами, вы спрашиваете, как заставить ошибку компилятора уйти, когда вы еще не выяснили, как распределить буфер памяти. –

+0

... или используйте строку с фиксированной длиной. Это зависит от того, что вы планируете читать. – Kusalananda

ответ

5

Прежде всего, %s в scanf() ожидает указателя на char, а не указателя на указатель на char.

Цитирование C11, глава §7.21.6.2/p12, fscanf() (внимание мое)

s
Соответствует последовательности без пробельных символов. 286)

Если ни один модификатор l длины не присутствует, то соответствующий аргумент должен быть указателя на начальный элемент массива символов достаточно большой, чтобы принять последовательности и завершающий нулевой символ, который будет добавлен автоматически. [...]

Изменить

scanf("%s",&string); 

в

scanf("%s",string); 

Это сказало, что вам нужно выделить память для string, прежде чем вы на самом деле пытаются сканирования в него. В противном случае вы будете использовать неинициализированный указатель, который вызывает undefined behavior.

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