4

我现在正在学习 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。更糟糕的是,这可能是用户试图利用您的程序(导致它读取不安全读取的数据)。 (见答案)

但是我必须在我的情况下添加什么才能没有来自编译器的警告?

4

6 回答 6

4

将其更改为printf("%s", quotes);添加quotes“字符串”或字符数组的说明符。

于 2013-10-25T07:55:14.890 回答
3

你需要告诉printf你正在打印的是什么。%s描述符会告诉 printf 你正在打印一个字符串。

=格式printf(“您正在打印的数据类型的描述符”,保存数据的变量);

字符串的描述符是 %s,对于字符 %c,对于 int %d

将 printf 更改为:

printf("%s",quotes);
于 2013-10-25T07:54:57.970 回答
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);
于 2013-10-25T07:55:12.890 回答
0

此警告是 gcc 告诉您它无法验证 printf 样式函数(printf、fprintf...等)的格式字符串参数的方式。当编译器无法手动查看字符串并确保在运行时一切都按预期进行时,会生成此警告。让我们看几个例子。

因此,正如其他建议明确使用格式说明符来告诉编译器...即

printf("%s",quotes);
于 2013-10-25T07:57:19.930 回答
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;
}
于 2013-10-25T08:16:51.140 回答
0

您收到警告是因为当您打印的字符串包含“%”时很危险。在这一行中,百分比没有意义,但是当你想打印它时:

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

当 printf 遇到第二个百分比并尝试从 printf 的堆栈中弹出一个值时,您的程序可能会崩溃。如果要打印百分号,请使用:“%%discount:”

于 2013-10-25T08:20:22.797 回答