求助,scanf的问题!!!
#include<stdio.h>int main()
{
char Lastname;
char Firstname;
printf("请输入你的姓:");
scanf_s("%c", &Lastname);
printf("请输入你的名:");
scanf_s("%c", &Firstname);
printf("%c%c", Lastname, Firstname);
return 0;
}
用vs2019写的,scanf那老是出错 本帖最后由 jackz007 于 2020-11-7 16:47 编辑
现在再试试看呢:
#include<stdio.h>
int main()
{
char Lastname ; // 修改【1】
char Firstname ; // 修改【2】
printf("请输入你的姓:") ;
scanf_s("%s", Lastname , 256) ; // 修改【3】
printf("请输入你的名:") ;
scanf_s("%s" ,Firstname , 256) ; // 修改【4】
printf("%s%s", Lastname ,Firstname) ;// 修改【5】
return 0;
} 在第8行,用scanf读取%c,若你输入一个字符然后回车,读取之后缓冲区会剩余一个回车字符
在第10行,再次用scanf读取%c,你不管你输入什么,都会被追加到缓冲区,scanf会把缓冲区的第一个字符即回车字符读取出来,这就导致与你的预期不符
解决方法:在两个scanf之间添加 ]getchar() 这个函数是读取缓冲区的一个字符,可以用于清除缓冲区剩余的回车字符。 #include<stdio.h>
#include<malloc.h>
char* fgetstring(FILE* _Stream) {
char* _Temp, * _Str;
size_t _Index = 0, _Capacity = 32;
if (_Str = (char*)malloc(32 * sizeof(char))) {
#define _Len (_Index + 1)
for (;;) {
if (_Len < _Capacity) {
LABEL:
switch (_Str = fgetc(_Stream)) {
case '\n':
case '\r':
case EOF:
_Str = '\0';
case '\0':
return (char*)realloc(_Str, _Capacity * sizeof(char));
}
++_Index;
}
else {
if (_Temp = (char*)realloc(_Str, _Capacity * sizeof(char))) {
_Str = _Temp;
_Capacity <<= 1;
goto LABEL;
}
else {
_Str = '\0';
return _Str;
}
}
}
#undef _Len
}
return NULL;//装饰
}
char* getstring() {
return fgetstring(stdin);
}
int main() {
char* a, * b;
printf("请输入你的姓:");
a = getstring();
printf("请输入你的名:");
b = getstring();
printf("%s%s", a, b);
return 0;
} jackz007 发表于 2020-11-7 16:45
现在再试试看呢:
可以了,想问一下为什么改成数组就可以了,萌新不懂 Bravo8 发表于 2020-11-8 15:38
可以了,想问一下为什么改成数组就可以了,萌新不懂
因为你从键盘输入的不是单个字符,而是由很多单个字符组成的字符串。 jackz007 发表于 2020-11-8 15:40
因为你从键盘输入的不是单个字符,而是由很多单个字符组成的字符串。
意思就是我输入abcd就是输入了三个字符,那么就是说我最多可以输入256个字符对于这个程序来说是吗? 本帖最后由 jackz007 于 2020-11-8 15:49 编辑
Bravo8 发表于 2020-11-8 15:43
意思就是我输入abcd就是输入了三个字符,那么就是说我最多可以输入256个字符对于这个程序来说是吗?
是的,Firstname 和 Lastname 各可以输入最多 255 个字符。因为每个字符串的末尾都必须要有一个字符串结束标志字符 '\0'
页:
[1]