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

更新

因为使用撇号 withprintf是 XSI 扩展(如@Dave 所述),为了使代码更具可移植性,遵循C-FAQ 问题 12.11中的建议并使用他们的commaprint.

4

2 回答 2

4

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

正如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 回答