使用for循环在数字中插入逗号不起作用

Posted

技术标签:

【中文标题】使用for循环在数字中插入逗号不起作用【英文标题】:Inserting commas in numbers using for loop not working 【发布时间】:2021-11-20 09:32:39 【问题描述】:

我尝试制作一个程序,它将逗号放在数字之间的某个位置。我的解释可能很模糊,但我只是想把12345678.23 变成12,345,678.23。我希望这能澄清我的解释。这是我的代码。

#include<stdio.h>
#include<string.h>

void main()

  char m[20]="12345678.23";
    int j=11, a, t=1, r=4, s;
    
    
        for(a=0; a=11; a++)
        
            if(strlen(m)==j)
            printf("%c", m[a]);
            if(a==t)
            printf(",");
            if(a==r)
            printf(",");
               
        
        
    

这个程序不起作用,我不知道为什么。我希望你们能帮助我。非常感谢!

【问题讨论】:

首先:正确格式化您的代码,例如您的学习材料中的示例。然后给你的变量起有意义的名字。这将使您的代码可读。另请阅读:ericlippert.com/2014/03/05/how-to-debug-small-programs 无关,只是深思:如果char m[20] = "foobar"; /*not a number*/怎么办?如果char m[20] = "-666.66"; /*hanging comma?*/ 怎么办?如果char m[20] = "1000042"; /*no period*/ 【参考方案1】:
#include <stdio.h>
#include <string.h>

int main(void) // Use the proper signature

    char m[] = "123"; // Do not hardcode the size
    char *p; // A pointer to traverse the string
    int mod; // Useful to know when to insert a comma

    p = strchr(m, '.'); // Position of the decimal separator
    if (p == NULL)
    
        p = strchr(m, '\0'); // Don't have decimal separator
    
    mod = (p - m) % 3; // Comma must be placed on each mod count
    p = m; // Rewind the pointer
    while (*p != '\0') // While the character is not NUL
    
        if (*p == '.') // Decimal separator reached
        
            mod = 3; // Avoid divisibility
        
        // If position divisbile by 3 but not the first pos
        if ((p != m) && (mod != 3) && (((p - m) % 3) == mod))
        
            putchar(',');
        
        putchar(*p);
        p++; // Next character
    
    putchar('\n');
    return 0;    

输出:

12,345,678.23

【讨论】:

【参考方案2】:

我实际上是偶然得到的。这是新代码

#include<stdio.h>
#include<string.h>

void main()

char m[12];
gets(m);
int j, a, t=1, r=4;
for(j=11; j>=0; j--)
     
        for(a=0; a<=j; a++)
        
            if(strlen(m)==j)
            
                printf("%c", m[a]);
                if(a==t)
                
                printf(",");
                
                if(a==r)
                
                printf(",");
                
               
        
        t--;
        r--;
    

输入的末尾至少要有 2 位小数,例如 1234.3412345678.87

【讨论】:

【参考方案3】:

请您尝试以下方法:

#include<stdio.h>
#include<string.h>

int main()

    char m[]="12345678.23";
    int len = strlen(m);                // length of string "m"
    char *p = strchr(m, '.');           // pointer to the decimal point
    int dp;                             // length of the decimal position (including the dot)

    if (p == NULL) dp = 0;              // decimal point does not appear
    else dp = len - (int)(p - m);       // length of the decimal position

    for (int i = 0; i < len; i++)      // loop over the characters of "m"
        putchar(m[i]);                  // print the character at first
        if ((len - dp - i - 1) % 3 == 0 && i < len - dp - 1) putchar(',');
                                        // print the comma every three digits from the 1's place backward
    
    putchar('\n');

    return 0;

它可以带或不带小数位。此外,逗号的位置是自动计算的。您不必显式分配它们。

【讨论】:

以上是关于使用for循环在数字中插入逗号不起作用的主要内容,如果未能解决你的问题,请参考以下文章

python:使用回车和逗号打印不起作用

为啥这种 for 循环并行化在 Python 中不起作用?

范围在 for 循环中不起作用

jQuery if 语句在 for 循环中不起作用

在 Pl/pgSQL 中使用 FOR 循环时,它在 Postgres 11.8 中不起作用

Jinja / Django for 循环范围不起作用