【问题标题】:Warning using ICC and printf with thousands grouping format (apostrophe)警告使用 ICC 和 printf 以及千位分组格式(撇号)
【发布时间】:2012-05-01 08:41:54
【问题描述】:

我需要以千位分组显示一些数字(在这种情况下,使用句点作为分隔符)。所以,我使用 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. 通过icc 编译器将' 用作printf 和朋友的标志是否安全?

更新

我刚刚意识到抑制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, question 12.11 的建议并使用他们的@987654334 实现可能更有用@。

【问题讨论】:

  • 命令行中的-wd269 是否禁用警告?
  • @PaulR: gcc 没有抱怨,甚至使用-Wall 编译。
  • @HostileFork:是的,使用该选项,警告将被禁用,但它也会禁用与代码 269 有关的任何其他错误或问题。
  • 恰好看到一个邮件列表说这不起作用:#pragma warning ( push )#pragma warning ( disable: 269 )、[违规代码]、#pragma warning( pop )...但是命令行开关确实如此。 :-/

标签: c locale printf number-formatting icc


【解决方案1】:

回答你的第二个问题,编译器实际上并不控制你的格式字符串的处理;那是你的 C 库的工作。 icc 无法识别格式字符串,因为它是非标准的,但只要您了解您的代码仅在其 c 库支持 ' 标志的平台上有效,就可以了。

正如opengroup page 所示,' 是 XSI 扩展,因此您的代码可以在任何符合 XSI 的平台上运行。

【讨论】:

    【解决方案2】:

    所以:

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多