| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4335 人关注过本帖
标题:用scanf读入一串数据,但遇到逗号就出现未知错误。
只看楼主 加入收藏
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
结帖率:93.75%
收藏
已结贴  问题点数:20 回复次数:19 
用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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
scanf()函數命名中的f,是format的首字母,即“格式化”,意思是說,這個函數的功能是通過掃描(scan)被格式化(format)過的字符串提取數據。要跳過不需要的字符,用scanf("%d,", &x),它的意圖是,讀入一個整數後,順帶掃過一個逗號,也就是說,你的輸入中必須在整數後面帶一個逗號,此逗號是略過不要的,但輸入中必須有,注意最後也需要逗號——這種掃描法始於C程序專門編寫從格式文本數據流中讀入數據,一般編製文本文件時都有這類統一的格式化間隔符。

爲什麽平時有人寫scanf("%d,%d", &a, &b)這類的代碼,在運行時經常出現問題呢?就是因爲他實際輸入的動作跟scanf()格式指示串"%d,%d"預期的不符,他沒有在兩個整數之間輸入逗號,那麽scanf()函數在讀入第一個整數之後掃描不到逗號,就影響後面的提取,於是運行出現毛病。這種問題,在編譯時是檢查不出來的,scanf()/printf()之類函數,雖然説是C的常用函數,但其機制本身卻與C語言靜態強類型檢查的特點截然相反,屬於典型的動態運行時函數,那本來是BASIC之類語言的優勢。

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


授人以渔,不授人以鱼。
2015-10-31 14:06
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
就事论事, 就楼主需要提取的那几个数字是可以用%s来处理的, 但这种方法仅对127以下的整数有效, 原因就是在C中, 127以下的整数和字符被认为是同一种东西。但是,有点麻烦而已。

代码测试环境:  WinXP+C-Free5.0.
2015-10-31 14:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
scanf()函數内部本來就是按樓主那樣的思路處理數據的,等於自己再寫一個罷了,沒什麽不可以的。真正的C程序,是不用現成庫函數的,C語言本身也沒提供任何函數。scanf()函數的設計,本來就用於這類需要。

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


授人以渔,不授人以鱼。
2015-10-31 14:17
书生牛犊
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
晚上回去告訴你

授人以渔,不授人以鱼。
2015-10-31 17:12
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 7楼 TonyDeng
那我晚上再看

φ(゜▽゜*)♪
2015-10-31 17:37
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
回复 8楼 书生牛犊
先研究一下scanf()函数吧。

代码测试环境:  WinXP+C-Free5.0.
2015-10-31 19:18
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:10 
回复 5楼 书生牛犊
scanf()函数确实可以自动处理一些字符,但是对于用户还是有要求的。

scanf("%d,%d",&a,&b);



在上面的语句中,%d后面是什么字符,你输入的时候就要应该是什么字符.

在没有字符的情况下,scanf只会处理空格,别的字符会报错.在格式控制字符是c的情况下, 空格它也不自动处理了.

代码测试环境:  WinXP+C-Free5.0.
2015-10-31 19:23
快速回复:用scanf读入一串数据,但遇到逗号就出现未知错误。
数据加载中...
 
   



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

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