标题:半个新人 C语言 输入一篇文章 或 输入一个带 “回车” 的字符串 难题
只看楼主
DrMike
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-4-28
结帖率:33.33%
已结贴  问题点数:20 回复次数:8 
半个新人 C语言 输入一篇文章 或 输入一个带 “回车” 的字符串 难题
大家好,小弟我不是计算机专业的,业余里有兴趣研究一下计算机,学一下C语言,也不算新新手了。但是是变成论坛的新人。

一直有个问题。

想用一个字符串数组存储一篇文章,有包含回车、空格等…
根据我自己的知识…用scanf感觉是不行的,因为scanf虽然可以用[^t]屏蔽空格,但是遇到回车就行了,他会自动结束输入。

感觉getchar可以,因为getchar是遇到EOF才结束的。
所以写了一段代码。

程序代码:
#include <stdio.h>
main(){

int MAX=100;   
int psg[MAX];  
int i;
i=0;

do{
psg[i]=getchar();
i++;
}while(psg[i-1]!=EOF);

printf("%s",psg);

    return 0;
}

编译没问题。

运行后就不行了,输入完后,按Ctrl+C结束(不知道为什么,我电脑按Ctrl Z/D不能结束,所以一个一个按,方向C可以,),什么都没输出。如果在printf("%s",psg);那边设置断点的,程序崩溃,并且根据编译器提示,psg里面也根本就不是我输入的东西。
如图:

网上找了很多资料,都没有这方面的内容。似乎C语言无法完成对一篇文章的输入啊…
搜索更多相关主题的帖子: 计算机专业 字符串 C语言 文章 知识 
2017-04-28 22:01
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:5 
逐字符读取,将这些字符转存进一个字符数组,结束之后,手动在字符数组的末尾添加 \0

[此贴子已经被作者于2017-4-28 22:03编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-28 22:02
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:5 
i没有初始化,而且你的数组是int型不是字符串

[此贴子已经被作者于2017-4-28 22:08编辑过]

2017-04-28 22:07
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:10 
输入“EOF”的具体方法应该是:
  Windows环境下   回车,Ctrl+Z,回车  
  Linux环境下   回车,Ctrl+D,回车
程序代码:
#include<stdio.h>


#include <stdio.h>
main(){

int MAX=100;   
char psg[MAX];  //字符是char,不是int 
int i;
i=0;

do{
psg[i]=getchar();
i++;
}while(psg[i-1]!=EOF&&i<MAX);//注意别让数组越界 

printf("{");
for(int j=0;j<i;j++){//为了能够更清楚看到数组中每个位置具体保存了些什么, 我们不妨逐个字符输出 
    printf("(%c)",psg[j]);
} 
printf("}\n");

psg[i]='\0';//C语言区分字符数组和字符串的关键标志就是'\0', 

printf("{%s}",psg);

    return 0;
}





[此贴子已经被作者于2017-4-28 22:30编辑过]


φ(゜▽゜*)♪
2017-04-28 22:14
DrMike
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-4-28
得分:0 
回复 3楼 Emotiona
啊,你好!真的是太感谢您的回答了。
这段代码是测试用的,之前这些比较低级的错误是没有的。可能是必要急啊。
我纠正过来以后,这下是可以了。
之前应该也是可以的,但是每次按完Ctrl+C后,SHELL窗口一下子就没掉了…我也来不及看到底有没有输出。
而如果把DEBUG的break放在printf下面的一个空行后,可以看到输出。这下就对了。
但是在放一个break在return 0,又崩溃了…如图
我还一直很不清楚,我这电脑到底是不是有问题,Ctrl+D 和Ctrl+Z都不是EOF。键盘一个一个试,终于发现Ctrl+C有反应,但程序就刷一下就没掉了。比较正常的是,执行完后,SHELL还会告诉你一下运行了多少时间。
程序代码:
#include <stdio.h>
main(){
    //the length of strings
int MAX=100; 
    //string arry  
char psg[MAX];  

int i;
i=0;

do{
psg[i]=getchar();
i++;
}while(psg[i-1]!=EOF);


printf("%s",psg);


    return 0;
}

如图

I wish I was a programmer.But the reality defeat me.
2017-04-28 22:23
DrMike
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-4-28
得分:0 

看到你们的回复,我感动的泪牛满面啊!太认真、太详细了!
我自己不是计算机专业的…平常利用少得可怜业余的时间来学一下计算机……
之前在某个所谓的什么大搜索引擎上问…要吗是广告,要吗是卖药的,要嘛是假医院…而且发的帖子还可能被删掉,没什么原因…倒是那些假广告到处都是,都不删…
OK!各位老师的方法我一一去试一下…到时候结果怎么样我再一一反馈。
谢谢大家了!

I wish I was a programmer.But the reality defeat me.
2017-04-28 22:27
DrMike
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-4-28
得分:0 
回复 2楼 renkejun1942
真的太感谢您的回答了!
我根据您的办法试一下!
到时候再给您反馈!

I wish I was a programmer.But the reality defeat me.
2017-04-28 22:29
DrMike
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-4-28
得分:0 
回复 4楼 书生牛犊
看到您的这么详细的回答,真的是泪牛满面啊!!!!
我先详细地学习一下您的指导!
太感谢您了!

I wish I was a programmer.But the reality defeat me.
2017-04-28 22:30
DrMike
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-4-28
得分:0 
回复 4楼 书生牛犊
您好!太感谢您了!
我知道为什么出错了,就是咋printf里面,字符串结尾没有'\0',根据你的方法,就不会出错了!

感觉WIndows确实怪怪的,EOF要  ENTER Ctrl+Z Enter
但是EOF前面那个ENTER会被写入到数组里面。
也就是为什么这边会多出一个ENTER。
手绘示意图如下:


所以,我觉得
应该是应该是psg[i-2]='\0'。如下图,我分别尝试了不同的i,分别为1,2,3,在prinf里面当成字符串输出的话,感觉还可以解释,比如i=1的,EOF当成一个 空 的输出了,

但如果是当成数组元素,一个一个输出的话,就很多不可解释了…
三个几乎一样,如下图:

注意:我用#来识别空格。

I wish I was a programmer.But the reality defeat me.
2017-04-29 01:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-476516-1-1.html




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

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