C语言,scanf 输入字符问题

C语言,scanf 输入字符问题,第1张

屏幕上输入的字符,会暂存到缓存。不信,你可以一直按着键盘,不多会,你就会听到系统发出嘟嘟的报警声,说明缓冲区已经满了。
scanf()函数只是从当前缓冲区取一个相应的字符;其中缓冲区的最后一个字符为'\n';
按你说的,可以用循环,接收字符同样可以用getchar()函数。
char
ch;
while(1){
scanf("%c",&ch);
if(ch=='\n')
break;
/
当输入回车时,结束
/
/
对ch做相应处理
/
}

用串S拷贝出另一个串T,对串T从头至尾扫描,对非数字字符原样写入串S,对于数字字符先写一个$符号再写该数字字符,最后,在S串尾加结束标志。使用此方法是牺牲空间,赢得时间。

#include <stdioh>
int fun(char s)
{
    char t[80];
    int i, j;
    for(i=0; s[i]; i++)  /将串s拷贝至串t/
        t[i]=s[i];
    t[i]='\0';
    for(i=0,j=0; t[i]; i++)
    /对于数字字符先写一个$符号,再写该数字字符/
        if(t[i]>='0' && t[i]<='9')
        {
            s[j++]='$';
            s[j++]=t[i];
        }
    /对于非数字字符原样写入串s/
        else
            s[j++]=t[i];
    s[j]='\0';  /在串s结尾加结束标志/
    return 0;
}
int main()
{
    char s[80];
    printf ( "Enter a string:" );
    scanf ("%s", s);  /输入字符串/
    fun(s);
    printf ("The result: %s\n", s);  /输出结果/
    return 0;
}

#include <stdioh>

#include <stringh>

int Insert(char a[],char num,int a_i);

void main()

{

int a_i;

char a[50],num;

printf("请输入一个字符串:");

gets(a);

printf("请输入您想插入的一个字符:");

num=getchar();

getchar();

printf("请输入您想插入的位置:");

fflush(stdin);

scanf("%d",&a_i);

if (Insert(a,num,a_i))

printf("没有插入!\n");

else

printf("插入后的字符串为:%s\n",a);

system("pause");

}

/函数功能:在字符串的某个位置插入一个字符/

int Insert(char a[],char num,int a_i)

{

int i;

if(a_i >= strlen(a))

{

printf("您输入的位置超出字符串长度了!");

return -1;

}

else

{

for(i=strlen(a);i >= a_i;i--)

{

a[i+1]=a[i];

}

a[i]=num;

return 0;

}

}

要看你的空字符串是怎么存储的了,如果是char str[]="";这样的话,str的大小已经固定,就没法添加字符了。
如果事先给字符数组预留了足够大的空间,就可以添加了。比如char str[10]="";str[0]='a';str[1]='\0';就可以了。或者strcat(str,"abc");这样也行。

1通过fopen打开文件,fputs像文件写入数据,fclose关闭文件。
#include
int main()
{
file pf = fopen("f:/1txt", "w+"); // 以写、创建形式打开文件
if (!pf)
return -1;
fputs("123abc456-1452=!@#$", pf); // 像文件写入字符串
fclose(pf); // 关闭文件
printf("ok");
return 0;
}
2file
fopen(
const
char
fname,
const
char
mode
);

fopen()函数打开由fname(文件名)指定的文件,
并返回一个关联该文件的流如果发生错误,
fopen()返回null
mode(方式)是用于决定文件的用途(例如
用于输入,输出,等等)
mode(方式)
意义
"r"
打开一个用于读取的文本文件
"w"
创建一个用于写入的文本文件
"a"
附加到一个文本文件
"rb"
打开一个用于读取的二进制文件
"wb"
创建一个用于写入的二进制文件
"ab"
附加到一个二进制文件
"r+"
打开一个用于读/写的文本文件
"w+"
创建一个用于读/写的文本文件
"a+"
打开一个用于读/写的文本文件
"rb+"
打开一个用于读/写的二进制文件
"wb+"
创建一个用于读/写的二进制文件
"ab+"
打开一个用于读/写的二进制文件
3int
fputs(
const
char
str,
file
stream
);
fputs()函数把str(字符串)指向的字符写到给出的输出流
成功时返回非负值,
失败时返回eof
4int
fclose(
file
stream
);
函数fclose()关闭给出的文件流,
释放已关联到流的所有缓冲区
fclose()执行成功时返回0,否则返回eof

这个是有关scanf的老生常谈了。
① 这个原理是基于标准C里面的whitespace的定义,空格、回车或换行符,制表符等被视为whitespace,而scanf中的格式“ %c”,已说明是按空格+字符来处理输入的。没有空格则格式中的空格被忽略, 如果有空格或回车换行,被当作空格对待。
② 这是技巧的出现,的确是因scanf的设计问题而应运而生的。scanf用的不好容易溢出; 一般认为应该避免使用它,用替代的方式如:while ((c = getchar()) != EOF && c != '\n');
③ 对“输入流”作fflush()不是标准的C方式, 意味着不同的编译器可能会有不同的结果,所以绝对应该避免。

直接看代码:
#include<stdioh>
#include<stringh>
void main()
{
char str[100],str_new[100],t;
char p=str;
int at=0;
puts("输入字符串:");
gets(str);
puts("要插入的字符:");
t=getchar();/输入的字符被存放在键盘缓冲区中直到按回车为止(回车字符也放在缓冲区中);其他字符会保留在键盘缓存区中,等待后续getchar调用读取/
fflush(stdin);//刷输入新缓存区的内容
puts("插入的位置:");
scanf("%d",&at);
if(at>strlen(str))
{
puts("输入长度应该小于字符串长度!");
return;
}
int j=0;
for(int i=0;str[i]!=0;i++)//新的字符串在这个for()生成
{
if(i==at-1)
str_new[j++]=t;
str_new[j++]=str[i];
}
str_new[j]='\0'; 
    puts(str_new);
}
这里使用生成新数组的for循环较简洁,但是要新定义一个数组,有一定的系统开销,读者也可以用其它的方法。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12608669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存