0

g++ 甚至不会编译它。我哪里错了?这些是错误消息:

gcc sign.c sign.c:在函数âmainâ: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");
    }
}
4

3 回答 3

11

首先,这只是一条警告消息,这意味着编译器检测到可能有问题,但还是编译了您的代码。正如您所注意到的,并非所有编译器都会给出相同的警告。

问题是这一行(以及所有其他类似的行):

printf(words);

使用时printf必须使用格式字符串,如下所示:

printf("%s", words);

否则,如果您正在打印的内容 ( words) 恰好包含任何%字符,那么printf()会将这些内容视为格式说明符并尝试读取您未提供的参数。

如果您只想自己打印一个字符串,那么puts可能很有用:

puts(words);

这将打印words后跟换行符。

于 2012-10-14T22:36:42.587 回答
3

警告基本上说你必须写

printf("%s", words);

而不仅仅是

printf(words);

实际上,使用它可能是您程序中的潜在错误,甚至是安全漏洞,例如,如果words由用户控制(这正是您的程序的情况),因此可能包含%n等。在您的情况下,words将被视为格式说明符。

于 2012-10-14T22:37:08.947 回答
2

您不应该使用带有未知格式字符串的 printf:

printf(words);

尝试

printf("%s", words);

在这种情况下,

printf("%s\n", words);
puts(words); // includes \n

会好的

于 2012-10-14T22:37:20.610 回答