C 通过指针打印文本

C 通过指针打印文本,c,pointers,C,Pointers,我现在正在学习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); } #包括 主要() { char*quotes=“音乐的一个好处是,当它击中你时,你不会感到痛

我现在正在学习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);     
}
#包括
主要()
{ 
char*quotes=“音乐的一个好处是,当它击中你时,你不会感到痛苦。\“Bob Marley\”\n;
printf(报价);
}
我从编译器那里得到一个警告“格式化不是字符串文字,没有格式参数”,当我执行程序时,它会成功运行。

我在这里读到了一些其他问题,他们从编译器那里得到了相同的警告,但我没有找到适合我的答案。我明白我收到这条信息的原因:


此警告是gcc告诉您它无法验证printf样式函数(printf、fprintf…等)的format string参数的方式。当编译器无法手动查看字符串并确保在运行时一切正常时,会生成此警告…

案例3。这就是你的情况。您正在获取运行时生成的字符串并尝试打印它。您得到的警告是编译器警告您字符串中可能有格式说明符。比如说“坏的%sdata”。在这种情况下,运行时将尝试访问不存在的参数以匹配%s。更糟糕的是,这可能是用户试图利用您的程序进行攻击(导致它读取不安全的数据)。


但是,为了不让编译器发出警告,我必须在本例中添加什么?

您需要告诉
printf
您正在打印的是什么<代码>%s描述符将告诉printf您正在打印字符串

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

字符串的描述符为%s,字符为%c,整数为%d

将printf更改为:

printf("%s",quotes);

必须以最简单的形式指定格式字符串:

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


将其更改为
printf(“%s”,引号)
它添加了一个说明符,
引号
是一个“字符串”或字符数组。

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

所以,正如其他建议的那样,显式使用格式说明符来告诉编译器

printf("%s",quotes);
试试这个:

#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;
}
#包括
主要()
{ 
char*quotes=“音乐的一个好处是,当它击中你时,你不会感到痛苦。\“Bob Marley\”\n;
放(引号);//或者
printf(“%s”,引号);//或
返回0;
}

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

int main ()
{ 
    int percent = 10;
    char *s = "%discount: %d\n";
    printf(s, percent);     
    return 0;
}
当printf遇到第二个百分比并试图从printf的堆栈中弹出一个值时,程序可能会崩溃。
当您想要打印百分比符号时,请使用:“%%折扣:”

put
添加换行符。对于您在发布问题之前所做的努力和搜索,相应的声明是
fputs(引号、标准输出)
+1。
int main ()
{ 
    int percent = 10;
    char *s = "%discount: %d\n";
    printf(s, percent);     
    return 0;
}