在C语言中,如何使用scanf来扫描1000000,忽略逗号

在C语言中,如何使用scanf来扫描1000000,忽略逗号,c,scanf,C,Scanf,在C语言中,当对1000000这样的数字使用scanf时,忽略逗号的最佳方法是什么?我认为最好的方法是不使用scanf。至少不使用任何数字格式 而是将其作为字符串读取,然后删除逗号,最后删除。删除逗号(或任何其他要跳过的字符)的方法有很多种。最简单(也是最灵活)的方法之一是简单地沿着输入字符串向下移动两个指针,将所有数字移到一起,忽略逗号。(您必须确保在最后一位之后nul terminate) 例如: #include <stdio.h> #include <stdlib.h&

在C语言中,当对1000000这样的数字使用
scanf
时,忽略逗号的最佳方法是什么?

我认为最好的方法是不使用
scanf
。至少不使用任何数字格式


而是将其作为字符串读取,然后删除逗号,最后删除。

删除逗号(或任何其他要跳过的字符)的方法有很多种。最简单(也是最灵活)的方法之一是简单地沿着输入字符串向下移动两个指针,将所有数字移到一起,忽略逗号。(您必须确保在最后一位之后nul terminate)

例如:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>

#define MAXC 25

long xstrtol (char *p, char **ep, int base);

int main (void) {

    char string[MAXC] = "";
    char *rp, *wp;          /* a read pointer and write pointer */
    int c;
    long n = 0;

    rp = wp = string;

    printf ("enter number with ',': ");
    if (!fgets (string, MAXC, stdin)) {
        fprintf (stderr, "error: insufficient input.\n");
        return 1;
    }

    /* work down each char in string, shifting number together */
    while (*rp && (('0' <= *rp && *rp <= '9') || *rp == ',')) {
        if (*rp == ',') { rp++; continue; }     /* skip commas */
        *wp++ = *rp;               /* shift digits together    */
        rp++;
    }
    *wp = 0;   /* nul-terminate */

    if (*rp != '\n') /* flush input buffer */
        while ((c = getchar()) != '\n' && c != EOF) {}

    printf ("\n string : %s\n", string);
    n = xstrtol (string, &rp, 10);       /* convert string to long */

    printf(" n      : %ld\n\n", n);

    return 0;
}

/** a simple strtol implementation with error checking.
 *  any failed conversion will cause program exit. Adjust
 *  response to failed conversion as required.
 */
long xstrtol (char *p, char **ep, int base)
{
    errno = 0;

    long tmp = strtol (p, ep, base);

    /* Check for various possible errors */
    if ((errno == ERANGE && (tmp == LONG_MIN || tmp == LONG_MAX)) ||
        (errno != 0 && tmp == 0)) {
        perror ("strtol");
        exit (EXIT_FAILURE);
    }

    if (*ep == p) {
        fprintf (stderr, "No digits were found\n");
        exit (EXIT_FAILURE);
    }

    return tmp;
}
看一下,如果你有任何问题,请告诉我。如果要将结果强制转换为
INT
,则可以对照
INT\u MIN
INT\u MAX
进行检查,但将答案保留为

作为一项功能

正如所指出的那样,它作为一项功能将更加有用。您可以将代码移动到一个简单的转换函数,并按如下方式调整主代码:

...
#define MAXC 25

long fmtstrtol (char *s);
long xstrtol (char *p, char **ep, int base);

int main (void) {

    char string[MAXC] = "";

    printf ("enter number with ',': ");
    if (!fgets (string, MAXC, stdin)) {
        fprintf (stderr, "error: insufficient input.\n");
        return 1;
    }

    printf(" number : %ld\n\n", fmtstrtol (string));

    return 0;
}

/* convert comma formatted string to long */
long fmtstrtol (char *s)
{
    if (!s || !*s) {
        fprintf (stderr, "fmtstrtol() error: invalid string.\n");
        exit (EXIT_FAILURE);
    }

    char *rp, *wp;  /* read pointer, write pointer */
    int c;

    rp = wp = s;

    while (*rp && (('0' <= *rp && *rp <= '9') || *rp == ',')) {
        if (*rp == ',') { rp++; continue; }
        *wp++ = *rp;
        rp++;
    }
    *wp = 0;

    if (*rp != '\n') /* flush input buffer */
        while ((c = getchar()) != '\n' && c != EOF) {}

    return xstrtol (s, &rp, 10);
}
...
。。。
#定义MAXC 25
长fmtstrtol(字符*s);
长xstrtol(字符*p,字符**ep,整数基);
内部主(空){
字符字符串[MAXC]=“”;
printf(“用“,”:”)输入数字;
如果(!fgets(字符串、最大值、标准输入)){
fprintf(stderr,“错误:输入不足。\n”);
返回1;
}
printf(“编号:%ld\n\n”,fmtstrtol(字符串));
返回0;
}
/*将逗号格式的字符串转换为长字符串*/
长fmtstrtol(字符*s)
{
如果(!s | |!*s){
fprintf(stderr,“fmtstrtol()错误:无效字符串。\n”);
退出(退出失败);
}
char*rp,*wp;/*读指针,写指针*/
INTC;
rp=wp=s;

while(*rp&('0'while(scanf(%4[^,],%4[^,],%79[^,],%d),sem,type,title,&value)==4)试试这个我不知道,但可能会改变?为什么是一个完整的工作程序?它可能是一个函数。没错,这只是一个自上而下的例子,我没有将其重新格式化为函数
:(
@haccks-lazness corrected-function
感谢您的努力。
...
#define MAXC 25

long fmtstrtol (char *s);
long xstrtol (char *p, char **ep, int base);

int main (void) {

    char string[MAXC] = "";

    printf ("enter number with ',': ");
    if (!fgets (string, MAXC, stdin)) {
        fprintf (stderr, "error: insufficient input.\n");
        return 1;
    }

    printf(" number : %ld\n\n", fmtstrtol (string));

    return 0;
}

/* convert comma formatted string to long */
long fmtstrtol (char *s)
{
    if (!s || !*s) {
        fprintf (stderr, "fmtstrtol() error: invalid string.\n");
        exit (EXIT_FAILURE);
    }

    char *rp, *wp;  /* read pointer, write pointer */
    int c;

    rp = wp = s;

    while (*rp && (('0' <= *rp && *rp <= '9') || *rp == ',')) {
        if (*rp == ',') { rp++; continue; }
        *wp++ = *rp;
        rp++;
    }
    *wp = 0;

    if (*rp != '\n') /* flush input buffer */
        while ((c = getchar()) != '\n' && c != EOF) {}

    return xstrtol (s, &rp, 10);
}
...