sscanf函数---一个简单的问题

#include <stdio.h>
int main(){
char s[20000];
int a[20000],i;
fgets(s,20000,stdin); //如输入:22 33 44 55 66 77
//此处怎么利用sscanf函数将s中的数字转到a中?
for(i=0;i<这里的大小是多少?;i++)
printf("%d",a[i]);
return 0;
}
在线等.....

这个问题不简单,只用一句sscanf是没有办法实现你的要求,而且用ssanf也不是好的方法, strtok虽然也不好,但这这里比sscanf的方案好。 如果非用sscanf,则需要间接转换,如下:

int n;
int *pa = a;
char ch[5]; /* 最大5位数,可修改*/
char *ps = s;

while( sscanf(ps, "%[^ ] %n", ch, &n) == 1 )
{
    printf("%s\n", ch);
    sscanf(ch, "%d", pa++);
    ps += n;
}

这样通过1个循环和2个sscanf,就可以实现字符串的分割及转换。 <---- 再次强调,这不是好方法。

追问

有啥简单的方法不?求教。

追答

简单和安全总是相对的。 如果希望代码最少, 可以把上面两个sscanf直接合并成一个,就如楼下给出的代码那样。 直接分割+转换,容易出问题,比如用户输入时候,多了一个其他符号,就需要错误处理了;所以先按字符分割,然后再转换比较好。 比如;

char *p;
int *pa = a;
for ( p = strtok(s, " "); p != NULL; p = strtok(NULL, " "))
{
    sscanf(p, "%d", pa++);
}

这样的好处是如果有其他分隔符,可以容易添加到strtok里面,而且也用到了sscanf,算是投机了一下。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-09
用 if (s[i]==' ' && ((s[i+1] >= '0') && (s[i+1] <= '9'))) 找各数字开始位置 做 转换。

#include <stdio.h>
#include <stdlib.h>
int main(){
char s[2000];
int a[2000],i,n;
fgets(s,2000,stdin); // if input 22 33 44 55 66 77

sscanf(s,"%d",&a[0]);
n=1;
for (i=1;i<strlen(s)-1;i++)
{
if (s[i]==' ' && ((s[i+1] >= '0') && (s[i+1] <= '9')))
{sscanf(&s[i+1],"%d",&a[n]); n++;}
}
for(i=0;i<n;i++) printf("%d ",a[i]);
return 0;
}本回答被网友采纳
第2个回答  2013-07-09
#include <stdio.h>
int main()
{    
 char s[20000];     
 int a[20000],i;     
 char* ps = s;
 int len;
 
 fgets(s,20000,stdin);// 22 33 44 55 66 77
 
 i=0;
 while( sscanf(ps, "%d %n", &a[i++], &len) == 1 )
 {
  ps += len;
 }
 //注意 i为a中元素个数加1  i=1 时候0个元素

 return 0;
}

sscanf函数---一个简单的问题
这个问题不简单,只用一句sscanf是没有办法实现你的要求,而且用ssanf也不是好的方法, strtok虽然也不好,但这这里比sscanf的方案好。 如果非用sscanf,则需要间接转换,如下:int n;int *pa = a;char ch[5]; \/* 最大5位数,可修改*\/char *ps = s;while( sscanf(ps, "%[^ ] %n", c...

单片机sscanf函数问题
定义函数 int sscanf (const char *str,const char * format,...);函数说明 sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。返回值 成功则返回参数数目,失败则返回-1,错误原因存于errno中。 返回0表示失败 否则...

C++用SSCANF函数提取出现的问题
sscanf(str,"%[^','],%lf, %lf,%[^','],%lf,%[^','],%lf",s1,&x,&y,s2,&x2,s3,&y2);以逗号为分格符,跳过一个字符串用:sscanf(str,"%*[^','],%lf, %lf,%*[^','],%lf,%*[^','],%lf",&x,&y,&x2,&y2);=== 注意,跳过用 %*[^','] ,后面无 ...

C++用SSCANF函数提取出现的问题
sscanf(str,"%[^','],%lf, %lf,%[^','],%lf,%[^','],%lf",s1,&x,&y,s2,&x2,s3,&y2);以逗号为分格符,跳过一个字符串用:sscanf(str,"%*[^','],%lf, %lf,%*[^','],%lf,%*[^','],%lf",&x,&y,&x2,&y2);=== 注意,跳过用 %*[^','] ,后面无 ...

c语言关于scanf的问题
首先,scanf,sscanf这类输入函数是支持一些简单的正则表达式。scanf("as%s",j); 的正则表达式就是"as%s",即限制输入要从as开始匹配,如果匹配不了,则认为输入错误,即相当于没有输入。如果匹配到as则后面的%s会把输入存放到f这个数组里。你可以试试这样的输入语句scanf("%*[^#]%s", j);它的...

sscanf函数
答案:sscanf函数是C语言中的一个标准库函数,用于从字符串中读取格式化输入。它可以根据指定的格式,将输入字符串中的数据提取并存储到指定的变量中。详细解释:1. 函数定义与功能:sscanf函数是C语言标准库中的一部分,它的主要功能是从字符串中读取格式化的输入数据。通过该函数,开发者可以指定一种格式...

sscanf函数的问题
格式化输入,将字符串"NUMPOLLIES %d\\n" %d是&numtriangles的整型值 保存到oneline(应该是字符数组)

sscanf函数问题 123\/456\/789\/abc.xxx 怎么提取最后一个\/之后的内容?最...
include <stdio.h>#include <string.h>int main(){ char b[20], c[20]; scanf("%s", b); do { sscanf(b, "%*[^\/]\/%s", c); sprintf(b, "%s", c); }while(strstr(c, "\/")); printf("%s\\n", c); return 0;}测试 输入:123\/456\/789\/abc...

c语言中关于sscanf函数的运用及%n的用法
在C语言中,`sscanf` 函数是一个强大的工具,用于解析字符串中的格式化输入。与 `scanf` 相比,`sscanf` 函数多了一个参数,这个参数是第一个参数,它指定了要被解析的字符串。简单来说,`sscanf` 函数实际上就是对输入字符串的操作。例如,我们有一个字符串 `charszText[1024] = "12334.4"`,...

关于sscanf()函数
“\\”这个只是说代码要分行书写时,在其后加"\\"就代表这一行的内容与下一行的内容是连续的。比如 int a\\ ,b;其实就是一行int a,b;代码编译是逐句的,早期编译器会把一行看成一句,所以为了”提醒“编译器,这一行与下一行是连续的。我们就在行末加"\\";而现在的编译器一般来说是不需要的 ...

相似回答