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 に答える