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