| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付赛孚耐:软件保护加密专家
身份认证令牌USB KEY   
共有 453 人关注过本帖
标题:有关输入一段话的问题
收藏  订阅  推荐  打印 
xfcy
Rank: 1
等级:新手上路
帖子:20
积分:282
注册:2008-9-15
有关输入一段话的问题

通过键盘输入一段话,但是getchar()只能从终端输入一个字符,用scanf函数格式控制字符s只能输入字符串 C程序设计 第三版(谭浩强)有关格式字符s是这样说明的:用来输入字符串,将字符串送到一个字符数组中,在输入是以非空白字符开始,以第一个空白字符结束。字符串以串结束标志‘ \0’作为七最后一个字符
如果我所输入的一段话中有空格怎么办,那不是一遇到空白就会结束
所以我用下面的程序
#include "stdio.h"
int main()
{ int a[3],i;
    printf("please input the sentences:\n");
    for(i=0;i<=2;i++)
      scanf("%s",&a[i]);
    for(i=0;i<=2;i++)
      printf("\n%s",a[i]);   
}
希望能通过循环一次一次的输入有空白的句子,但是运行时如果不按ENTER键的话可以输入很多中间有空白的句子,但是只要敲3次ENTER键就会让VC停止工作,而且还不会有输出
请教各位
搜索更多相关主题的帖子: 输入  
2008-10-8 22:24
广陵绝唱
Rank: 12Rank: 12Rank: 12
等级:版主
威望:7
帖子:1262
积分:14297
注册:2008-2-15


程序代码:
#include<stdio.h>
#define N 10000
int main(void)
{
    char c,ch[N];
    int i=0,j;
    do
    {
        scanf("%c",&c);
        ch[i++]=c;
    }while(c!=EOF);
    for(j=0;j<i;j++)
        printf("%c",ch[j]);
    return 0;
    getch();
}
2008-10-8 23:26
xfcy
Rank: 1
等级:新手上路
帖子:20
积分:282
注册:2008-9-15

我运行了一下出现了一个警告‘getch’undefined assuming extern returning int
而且我不知道怎样是他停下来,即怎样输入EOF
谢谢
2008-10-9 21:42
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:贵宾
威望:12
帖子:2501
积分:26440
注册:2007-11-16

输入EOF:按Ctrl+Z

广陵,为什么不用getchar?
还有,LZ你可以使用fgets(str,100,stdin)和scanf("%100[^\n]%*c",str)这两种方法。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-9 22:14
广陵绝唱
Rank: 12Rank: 12Rank: 12
等级:版主
威望:7
帖子:1262
积分:14297
注册:2008-2-15
回复 4# StarWing83 的帖子

to:SW
    谢谢指正,用getchar()也可以的。

    另外,把你的两种方法用了一下,fgets 和 scanf("%100[^\n]%*c",str)只能读到换行符或者EOF为止,但是如果用户想输入换行符,但不想结束输入,就不行了。所以,我选择了用上述的方法,只要在字符串长度范围之内,输入几个 \n 都没问题。

to:xfcy
    按ctrl+z就是结束标志。如果你的编译器出现了警告,可以把最后一行的getch();删除。
2008-10-9 23:38
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:贵宾
威望:12
帖子:2501
积分:26440
注册:2007-11-16

to广陵:
通常,读文本文件都是一行一行地读的,这样比较好处理,如果你需要一次读完整个文件,还是建议使用fread/fwrite函数,比如:
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char arr[1001];
    fread(arr,1,1000,stdin);
    arr[1000] = '\0';
    puts(arr);

    return 0;
}
你的程序,如果用户输入超过了N,那就会发生溢出,这是很难Debug的错误,而我的就不会。

发现自己的代码中有个小Bug,可能造成puts非法访问内存,已经改过来了。

[ 本帖最后由 StarWing83 于 2008-10-10 00:48 编辑 ]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-10 00:12
广陵绝唱
Rank: 12Rank: 12Rank: 12
等级:版主
威望:7
帖子:1262
积分:14297
注册:2008-2-15

thank you to SW:

    主要是又知道了一个函数,也知道了什么是stdin,呵~
2008-10-10 00:26
永夜的极光
Rank: 12Rank: 12Rank: 12
等级:版主
威望:26
帖子:2710
积分:35264
注册:2007-10-9

SW的这两招还真不错,学习一下

PS:难道scanf还能支持正则表达式?

从BFS(Breadth First Study)到DFS(Depth First Study)
学习VIM中,欢迎访问我的blog  http://hi.baidu.com/newkedison
严重鄙视一切把论坛当成作业生成器和人肉搜索引擎的人
2008-10-10 08:19
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:贵宾
威望:12
帖子:2501
积分:26440
注册:2007-11-16

恩,不过支持得很有限,其实只是支持[]和[^]而已……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-10 08:29
永夜的极光
Rank: 12Rank: 12Rank: 12
等级:版主
威望:26
帖子:2710
积分:35264
注册:2007-10-9

前段时间学VIM,现在看到支持正则表达式的东西都比较兴奋

从BFS(Breadth First Study)到DFS(Depth First Study)
学习VIM中,欢迎访问我的blog  http://hi.baidu.com/newkedison
严重鄙视一切把论坛当成作业生成器和人肉搜索引擎的人
2008-10-10 08:59
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.057955 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved