| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4335 人关注过本帖
标题:用scanf读入一串数据,但遇到逗号就出现未知错误。
取消只看楼主 加入收藏
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
结帖率:93.75%
收藏
已结贴  问题点数:20 回复次数:8 
用scanf读入一串数据,但遇到逗号就出现未知错误。
输入样式:2,3,1,5,6,76,89,31,90
我在编写程序的时候怎样才能避开“逗号”,把数值放到数组里?

我想了一下,本来我是打算用scanf“%s”来获取一串字符的数组,然后用其中的每一个字符去判断是否为数值
程序代码:
#include"stdio.h"
#define N 30
int main(){
    char a[N];int b[10];
    scanf("%s",a);
    for(int j=0;;j++){
        for(int i=0;i<N;i++)
        if(a[i]<=9&&a[i]>=0)b[j]=a[i]-'0';
    }
    return 0;

 }
但是后来我突然意识到,这种方法在放数据的时候是逐个字符进行读写的,对十以内的数可以转换,大于十的就不行了,就会出错。
C语言,解决这种问题有没有什么办法?还是说,我应该把程序写复杂点,逐个字符读入,读到“逗号”停下,逗号前面的把他合并为一个数,然后继续。可是这种方法的话他也处理不了最后一个字符的读入啊,因为已经没有逗号给他做标识了。
         —————————————根据诸位的讨论,我把源程序改了,可是运行结果和预期的不一样。———————————————————————————

所以,对于这样用逗号隔开的数据他和用空格、回车隔开的数据一样,程序是可以区分开来的了?
那为什么下面这段代码,我把用逗号隔开的数据输入进去就出错了。没有错误提示。我才刚刚把第一组九个数据“2,3,1,5,6,76,89,31,90”输进去他就输出9个0和一个2,根本就不等我执行下一次输入。错得很莫名其妙
程序代码:
程序代码:
#include"stdio.h"
#define N 30
void pai(int a[]){
    int t;    
    for(int j=0;j<10;j++){
        for(int i=j+1;i<10;i++){
            if(a[i]<a[j]){t=a[j];a[j]=a[i];a[i]=t;}
        }
    }
}

int main(){
        int i=0;int b[N]={0};int cnt =0;char c;
    for(int i=0;i<9;i++)
        scanf("%d",&b[i]);//我在这里插入一个循环输出语句,发现读入数据的时候,只读到了第一个数据2,从第一个逗号开始后面的都没有值,全是我初始化的零
    pai(b);
        scanf("%d",&b[0]);    
    pai(b);cnt=0;
    for(int i=0;i<10;i++){
        if(cnt)printf(",");
            printf("%d",b[i]);cnt++;}printf("\n");
    return 0;
}


相反,如果我是用空格作为分割符来输入同样的数据他的运行结果就是对的了?(这道题是慕课网上课程里的习题,由系统自动输入,评分,看不到错误提示。)

[此贴子已经被作者于2015-10-31 15:59编辑过]

搜索更多相关主题的帖子: 编写程序 color 
2015-10-31 13:48
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 2楼 TonyDeng
所以,对于这样用逗号隔开的数据他和用空格、回车隔开的数据一样,程序是可以区分开来的了?
那为什么下面这段代码,我把用逗号隔开的数据输入进去就出错了。没有错误提示。我才刚刚把第一组九个数据“2,3,1,5,6,76,89,31,90”输进去他就输出9个0和一个随机数,根本就不等我执行下一次输入。错得很莫名其妙
程序代码:
#include"stdio.h"
#define N 30
void pai(int a[]){
    int t;    
    for(int j=0;j<10;j++){
        for(int i=j+1;i<10;i++){
            if(a[i]<a[j]){t=a[j];a[j]=a[i];a[i]=t;}
        }
    }
}

int main(){
        int i=0;int b[N]={0};int cnt =0;char c;
    for(int i=0;i<9;i++)
        scanf("%d",&b[i]);
    pai(b);
        scanf("%d",&b[0]);    
    pai(b);cnt=0;
    for(int i=0;i<10;i++){
        if(cnt)printf(",");
            printf("%d",b[i]);cnt++;}printf("\n");
    return 0;
} 

相反,如果我是用空格作为分割符来输入同样的数据他的运行结果就是对的了?(这道题是慕课网上课程里的习题,由系统自动评分,看不到错误提示。)

φ(゜▽゜*)♪
2015-10-31 15:12
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
补充这个程序的目的
:题目内容:
  编写程序,在主函数中定义一个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出。
输入格式:
  9个整数和1个整数
输出格式:
  10个整数
输入样例:
2,3,1,5,6,76,89,31,90[回车]
7[回车]
输出样例:
1,2,3,5,6,7,31,76,89,90[回车]
——————————————————————————————
上一次遇到这种用逗号隔开的数据,我在scanf里面用两个%d夹着一个%c,蒙混过关。可是这一次给了九个数据,我要是还一个个去夹%c,就太对不起这门语言了。所以才会特别想要知道,这里面的问题根源是什么。去测试数据,也没搞懂

φ(゜▽゜*)♪
2015-10-31 15:20
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 7楼 TonyDeng
那我晚上再看

φ(゜▽゜*)♪
2015-10-31 17:37
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 10楼 vvvcuu
所以说,scanf语句他并没有智能到可以用逗号作为分隔符,
以下是引用书生牛犊在2015-10-31 15:20:43的发言:

补充这个程序的目的
:题目内容:
  编写程序,在主函数中定义一个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出。
输入格式:
  9个整数和1个整数
输出格式:
  10个整数
输入样例:
2,3,1,5,6,76,89,31,90[回车]
7[回车]
输出样例:
1,2,3,5,6,7,31,76,89,90[回车]
——————————————————————————————
上一次遇到这种用逗号隔开的数据,我在scanf里面用两个%d夹着一个%c,蒙混过关。可是这一次给了九个数据,我要是还一个个去夹%c,就太对不起这门语言了。所以才会特别想要知道,这里面的问题根源是什么。去测试数据,也没搞懂

所以,对于这样的题目,我还是需要先从屏幕获取字符串,然后通过逐个对比,运用一些手段去生成这个数组。
        我还想着会不会已经有了通用的解决方案了呢,
慕课网上的答题已经应付过关了……还是把九个输入用一句
scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d",&b[0],&b[1],&b[2],&b[3],&b[4],&b[5],&b[6],&b[7],&b[8]);
写完,怎么感觉这么笨嘞……

[此贴子已经被作者于2015-10-31 20:24编辑过]


φ(゜▽゜*)♪
2015-10-31 20:23
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 13楼 vvvcuu
这个我理解了,scanf语句应该是尽可能简洁为好,这样尽可能少的去给用户添加限制会使程序的健壮性更强。
程序代码:
#include<stdio.h>
main()
{int a,b=5,c=5;
scanf("%d%d%d",&a,&b,&c); 
printf("%d,%d,%d",a,b,c);
}

好像这样形式的scanf,他在读入的时候就是默认使用空格或者回车作为分隔符来分别读入数据。而这里一旦输入逗号他也是分辨不了的,读不到数据。
----------------------------------------------------------------
我也在百度上找过其他的屏幕输入语句:好像gets之类的。但都没有直接能帮助我转换数据的,都是先读入字符串,再自行编程转换。

φ(゜▽゜*)♪
2015-11-01 01:01
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 13楼 vvvcuu
就好像加入我在编译的时候,手欠在scanf语句里加了什么提示性字词啊,

    等程序编译完成,交付使用的时候,用户就会很头疼了。
        
        因为他输入的时候就必须和我scanf里的格式一模一样(包括全半角、数据类型等)。

所以我们非常有必要慎重对待这类scanf语句,引号里面的部分能不多写绝不赘述。引号后面的要跟一个指向地址的变量(通常也都是用&指针。)

φ(゜▽゜*)♪
2015-11-01 01:08
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 19楼 TonyDeng
今天的课程讲到了scanf语句,尤其是提到了怎样解决逗号的问题。

scanf语句里面有一个特殊参数叫“*”这个字符表示读入到该数据时忽略不要。所以,对于整篇帖子所要解决的问题,有这样一种解法:


scanf("%d%*c",a[i]);//这里运用了%*c来忽略掉一个未知的字符,从而达到即可以分辨出逗号、顿号、甚至小数点(我测试过了,如果我前面是%d,那么我输入12.34 55.62他所能读入的就是四个数,分别是12,34,55,62.没有小数。)


----------------
我就说嘛,使用人数这么多、使用范围这么广的一种语言,他怎么会解决不了一个逗号的问题呢!哈哈,果然还是我见识的不够多啊~~

φ(゜▽゜*)♪
2015-11-02 13:58
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 19楼 TonyDeng
我还是没有看懂那个“%d空格,”的奥秘。
        我在计算机上运行你的程序,确实达到了效果,可以辨认出逗号来,也可以空格、回车。

但是我在自己写了一个简单的输入输出程序去验证,却发现我写的scanf(“%d ,%d”)语句还是要求我输入的两个数之间必须有逗号。我要是输入空格,他就读到1(是不是乱码我就不知道了)。
        我今天刚刚学到“*”的用法,感觉还是比较适用的,可以同时处理空格、顿号、逗号、回车、等一系列数字以外的字符(只支持半角字符,如果顿号用中文输入,那也会导致出错,如何解决尚未知。)。附上运行图示
程序代码:
#include <stdio.h>
#include <conio.h>
int main(){
    int a,b;
    for(int i=0;i<5;i++)
    {scanf("%d%*c%d",&a,&b);
    printf("%d %d\n--------------第%d次测试---------\n",a,b,i);
    }
    return 0;
}

图片附件: 游客没有浏览图片的权限,请 登录注册

φ(゜▽゜*)♪
2015-11-02 14:33
快速回复:用scanf读入一串数据,但遇到逗号就出现未知错误。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020771 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved