1

数千のグループでいくつかの数値を表示する必要があります(この場合、区切り文字としてピリオドを使用します)。だから、私はその'ようなことを達成するためにprintfフラグを使用しています。

gccすべてがうまくいきますが、を使用するとicc、次の警告が表示されます。

警告#269:無効なフォーマット文字列変換

番号が実際に希望の形式で印刷されているという事実にもかかわらず。

たとえば、この単純なプログラムをコンパイルすると、次のようになります。

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char *argv[]) {
    setlocale(LC_NUMERIC, "da_DK");
    int i = 12345678;
    unsigned long int j = 987654321;

    printf("%d \t %'d \n%lu \t %'lu \n", i, i, j, j);
}

次に、この警告が表示されます。

% icc -o simple simple.c 

simple.c(10): warning #269: invalid format string conversion
  printf("%d \t %'d \n%lu \t %'lu \n", i, i, j, j);
                                          ^

すべてが期待どおりに機能するという事実にもかかわらず:

% ./simple 
12345678         12.345.678 
987654321        987.654.321 

だから私の質問は:

  1. この警告をどのように抑制できますか?
  2. コンパイラを使用'して、printfやその仲間と一緒にフラグとして使用しても安全ですか?icc

更新

269警告を抑制するための奇妙なトリックは、フォーマットを使用して変数を定義し、その変数をprintf:に渡すことであることに気づきました。

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char *argv[]) {
    setlocale(LC_NUMERIC, "da_DK");
    int i = 12345678;
    unsigned long int j = 987654321;
    const char *strFormat = "%d \t %'d \n%lu \t %'lu \n";

    printf(strFormat, i, i, j, j);
}

更新

でアポストロフィを使用するprintfのはXSI拡張機能であるため(@Daveで述べられているように)、コードの移植性を高めるには、C-FAQの質問12.11の推奨事項に従い、の実装を使用する方が便利な場合がありcommaprintます。

4

2 に答える 2

4

2番目の質問に答えるために、コンパイラは実際にはフォーマット文字列の処理を制御しません。それがあなたのCライブラリの仕事です。は非標準であるためフォーマット文字列を認識しませんが、コードがcライブラリがフラグをiccサポートしているプラ​​ットフォームでのみ有効であることを理解している限り、問題はありません。'

opengroupページに示されているように、は'XSI拡張機能であるため、コードはXSI準拠のプラットフォームで機能します。

于 2012-04-19T18:54:10.797 に答える
0

それで:

#include <stdio.h>

void punt(int n){
    char s[28];
    int i = 27;
    if(n<0){n=-n; putchar('-');} 
    do{
        s[i--] = n%10 + '0';
        if(!(i%4) && n>9)s[i--]=' ';
        n /= 10;
    }while(n);
    puts(&s[++i]);
}


int main(){

    int a;
    scanf("%d",&a);
    punt(a);

}

とか、ぐらい:

#include <stdio.h>

int main() {
    char str[50];
    int len = 0;   
    scanf("%48[^\n]%n", str, &len);

    int start = len % 3;

    for(int i = 0; i < len; i++) {        
        if(i == start && i != 0) {
            printf(" ");
        } else if((i - start) % 3 == 0 && i != 0) {
            printf(" ");
        }    
        printf("%c", str[i]);
    }   

   return 0;
}
于 2019-02-12T17:05:38.830 に答える