2013-10-25 5 views
3

Я изучаю теперь c и я придумываю этот пример, где я могу печатать текст с помощью указателей.печатать текст по указателю

#include <stdio.h> 

main() 
{ 
    char *quotes = "One good thing about music, when it hits you, you feel no pain. \"Bob Marley\"\n"; 
    printf(quotes);  
} 

я получаю предупреждение от компилятора «формата не строковые и не аргументов формата», и когда я выполнить программу он работает успешно.

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

Это предупреждение - это способ gcc сообщить вам, что он не может проверить аргумент строки формата для функции стиля printf (printf, fprintf ... и т. Д.). Это предупреждение генерируется, когда компилятор не может вручную заглянуть в строку и убедиться, что все будет идти так, как вы планируете во время выполнения ...

Случай 3. Теперь это ваш случай. Вы берете строку, сгенерированную во время выполнения, и пытаетесь ее распечатать. Предупреждение, которое вы получаете, это компилятор, предупреждающий вас о том, что в строке может быть спецификатор формата. Скажем, например, «bad% sdata». В этом случае среда выполнения попытается получить доступ к несуществующему аргументу для соответствия% s. Хуже того, это может быть пользователь, пытающийся использовать вашу программу (заставляя ее читать данные, которые небезопасно читать). (See the answer)

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

+2

+1 для усилий и поиска, которые вы выполнили перед отправкой вопроса. – yaylitzis

ответ

4

Изменить его printf("%s", quotes);, который добавляет спецификатор, что quotes является «строка», или массив of char.

3

Вы должны сообщить printf, что вы печатаете. %s дескриптор скажет printf, что вы печатаете строку.

Формат printf = («дескриптор того, какой тип данных вы печатаете», переменная, удерживающая данные);

дескриптор струнами% s, для символов% с, для Int% D

Изменить Printf на:

printf("%s",quotes); 
2

Вы должны указать формат строки - в простейшей форме:

char *quotes = "One good thing about music(...)\n"; 
printf("%s", quotes); 

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

char *quotes = "One good thing about music(...)"; // no newline 
printf("%s\n", quotes); // newline added here 

или, если вы не хотите возиться со строками формата:

char *quotes = "One good thing about music(...)"; // no newline 
puts(quotes); // puts() adds newline 

или

char *quotes = "One good thing about music(...)\n"; 
fputs(quotes,stdout); 
+1

'puts' добавляет новую строку. Эквивалентным утверждением является 'fputs (quotes, stdout)'. –

0

Это предупреждение - это способ gcc сообщить вам, что он не может проверить аргумент строки формата функции функции printf (printf, fprintf ... и т. Д.). Это предупреждение генерируется, когда компилятор не может вручную заглянуть в строку и убедиться, что все будет идти так, как вы планируете во время выполнения. Давайте рассмотрим несколько примеров.

Так как другие предлагаемые явно используют спецификатор формата, чтобы сообщить компилятору ... т.е.

printf("%s",quotes); 
0

Попробуйте это:

#include <stdio.h> 

main() 
{ 
char *quotes = "One good thing about music, when it hits you, you feel no pain. \"Bob Marley\"\n"; 
puts(quotes);  //Either 
printf("%s",quotes);//or 
return 0; 
} 
0

Вы получаете предупреждение, потому что это опасно, когда строка Распечатываемый содержит «%». В этой линии не имеет смысла процентов, но если вы хотите, чтобы напечатать это, например:

int main() 
{ 
    int percent = 10; 
    char *s = "%discount: %d\n"; 
    printf(s, percent);  
    return 0; 
} 

ваша программа, скорее всего, сбой при Printf встречает второй процент и пытается выскочить значение из стека из Printf. Если вы хотите напечатать знак процента, используйте: «%% discount:»

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