g ++甚至不会编译它。我哪里错了?这些是错误消息:
gcc sign.c sign.c:在函数中: sign.c:35:2:警告:格式不是字符串文字而没有格式参数[-Wformat- security]
=============================================== ===================================
#include "stdio.h"
int string_length(char str[]);
void string_sort(char s[]);
void string_sort(char s[])
{
char tmpt;
int i, j, len;
len=string_length(s);
for(i=0; i<len-1; i++){
for (j=i+1; j<len; j++){
if (s[i] > s[j]){
tmpt=s[i];
s[i]=s[j];
s[j]=tmpt;
}
}
}
}
int string_length(char str[]){
int i;
for(i=0; i<80; i++){
if(str[i]=='\0'){
return(i);
}
}
}
int main(){
char words[80];
scanf("%s", words);
printf(words);
string_sort(words);
printf(" ");
printf(words);
printf("\n");
while ( words != " "){
scanf("%s", words);
printf(words);
string_sort(words);
printf(" ");
printf(words);
printf("\n");
}
}
答案 0 :(得分:11)
首先,这只是一个警告消息,这意味着编译器检测到可能出错的内容但无论如何编译了您的代码。正如您所注意到的,并非所有编译器都会发出相同的警告。
问题是这一行(以及所有其他类似的行):
printf(words);
使用printf
时,必须使用格式字符串,如下所示:
printf("%s", words);
否则,如果您正在打印的内容(words
)中恰好有%
个字符,那么printf()
会将这些字符视为格式化说明符并尝试读取你没有提供。
如果您只想自己打印字符串,那么puts
可能很有用:
puts(words);
这会打印words
后跟换行符。
答案 1 :(得分:3)
警告说基本上你必须写
printf("%s", words);
而不仅仅是
printf(words);
事实上,使用它可能是您程序中的潜在错误,甚至是安全漏洞,例如:如果words
由用户控制(这与您的程序完全相同),因此可能包含%n
等。在您的情况下,words
将被视为格式说明符。< / p>
答案 2 :(得分:2)
您不应将printf与未知格式字符串一起使用:
printf(words);
尝试
printf("%s", words);
在这种情况下,
printf("%s\n", words);
puts(words); // includes \n
会很好