C语言编程,关于getchar()

要求是用getchar读长度各不超过50个字符的两个字符串。(空格也可以读取到)并且将两句字符串连在一起打印当长度超过要求后,打印错误提示我用scanf可以写出,但是ge... 要求是用getchar读长度各不超过50个字符的两个字符串。(空格也可以读取到)
并且将两句字符串连在一起打印
当长度超过要求后,打印 错误提示

我用scanf可以写出,但是getchar()不是很懂应该怎么写,还有可以帮忙解释下strcat(a,b) (假设ab是两段字符串)
希望大神们可以帮帮我写下代码,感谢🙏
展开
 我来答
自我编程
2019-07-12 · 科技优质答主
自我编程
采纳数:1481 获赞数:4285

向TA提问 私信TA
展开全部

getchar就是接收一个字符。strcat(a,b)就是将b字符串内容放在a字符串最后一个字符串后面,前提a字符串的内存地址必须能够容纳a,b字符个数的和,且内存地址不能重叠。

#include<stdio.h>

#include<string.h>

#include<malloc.h>

char *getSting(int maxLen);//读取字符串输入 最大读取长度maxlen。成功返回字符串,失败返回NULL

int main()

{

char *str1=getSting(50);

char *str2=getSting(50);

int len=strlen(str1)+strlen(str2)+1;

char str12[len];//用于保存拼接字符串的地址必须大于等于两个字符串长度和+1

str12[0]=0;

strcat(str12,str1);

strcat(str12,str2);

printf("拼接后的字符串为:%s\n",str12);

return 0;

}

char *getSting(int maxLen)//读取字符串输入 最大读取长度maxlen。成功返回字符串,失败返回NULL

{

int n=1;

char *str=(char *)malloc(sizeof(char)*(maxLen+1)),*strSave=NULL;

//预申请(maxLen+1)大小的内存空间

if(!str)

{

printf("异常!内存申请失败!\n");

return NULL;

}

memset(str,0,maxLen+1);

while(1)

{

str[n-1]=getchar();

if(n==maxLen+1 && str[n-1]!=10)//当输入字符已到最大

{

printf("输入超出数组上限!\n");

return NULL;

}

if(str[n-1]==10)//当输入回车,结束输入

{

strSave=(char *)realloc(str,sizeof(char)*(n+1));//释放未使用的内存

if(!strSave)

{

printf("异常!内存申请失败!\n");

return NULL;

}

str=strSave;

str[n-1]=0;

return str;

}

else

n++;

}

return NULL;

}

syht2000
高粉答主

2019-07-12 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.5亿
展开全部

原型

extern char *strcat(char *dest, const char *src);

用法

#include <string.h>

头文件

在C中,函数原型存在 <string.h>头文件中。

在C++中,则存在于<cstring>头文件中。

功能

把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。

说明

src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

至于你的问题,你没说清这两个字符串是什么样的格式,是以回车分开还是写在一行,下面代码是假定以回车分开,一行算一个字符串

#include <stdio.h>

int main() {

char buffer[101];

int i,j=0,r=0;

int error=0;

char c;

while(r<2) {

i=0;

while((c=getchar())!='\n' && i<50) {

buffer[j++]=c;

i++;

}

if(i>=50) {

error=1;

break;

}

if(c=='\n') r++;

}

buffer[j]='\0';

if(error) printf("ERROR");

else printf("%s",buffer);

}

更多追问追答
追问
想再仔细问一下这个代码
问题1:之后的while(i<2)的作用是什么呢,变量r的作用是什么
问题2:在i++的时候是先将第一个字符串的内容逐字存到数组里,在j++的时候存第二个数组吗==
追答
  1. 因为要计算输入多行内容,所以这里的r就是一个回车的计数,每读到一个\n就加1,当r为2的时候当然就是读入两行了,可以结束循环了

  2. i++同样也只有计算每一行输入的内容有多少,超过50就设置错误标记,j++才是把内容存入数组,这里只有一个数组,没有什么第二个数组

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
l7722526
2019-07-12 · TA获得超过2.7万个赞
知道大有可为答主
回答量:2.8万
采纳率:84%
帮助的人:4026万
展开全部
因为你要通过scanf从标准输入读取一个整型值,但是你在标准输入却输入了"整型值“+”回车“,整型值被scanf读入,”回车“却停留在标准输入的缓冲区。你后面再调用getchar(),就会从标准输入的缓冲区读取到缓冲的”回车键“。故没机会从标准输入直接读取。
可以将你的程序修改,在scanf之后增加一个语句,把标准输入的缓冲区读完:
scanf("%d", &a);
while (getchar()!='\n') ;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
桃子是我的命呀
2019-07-12 · TA获得超过736个赞
知道小有建树答主
回答量:877
采纳率:54%
帮助的人:111万
展开全部
有啥好处👀😀
更多追问追答
追问
??我忘记设置悬赏了吗
追答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式