登录

在这个站点登录

保存我的登录记录

<<忘记密码?

还没有账号?点此注册>>

Jerry

9.6 在指定位置中插入字符串

分享到:

本文已被浏览2128

今天突然想写点C,就做了个题~~~

额…言归正传哈!

根据题目分析一下这个问题的意思:

先读入一个字符串,然后再读入一个字符串,最后读入一个字符.然后在第一个字符串中可能(没)有最后一个字符,如果有就把第二个字符串插到这个字符的前面,其余不变.因为用到了单个字符,所以按次序扫描第一个字符串是在所难免的了(目前我还没搞到插入字符串的函数,如果有就爽爆了~~).

明白了这个程序详细的工作流程那么就可以向算法转换了:

Step 0:Input Strings (Raw,Incert)& Char(ts)

Step 1:从Raw的第0个元素开始和ts比较,如果相同去Step 3

Step 2:下一个元素去Step1

Step 3:按次序将Incert的字符插入Raw

Step 4:添加Raw中剩余字符

Step 5:打印字符串

转换成代码就是:

#include <stdio.h>
#include <string.h>
int main() {
     //定义变量用于存储
     char Raw[100],Incert[100],Data[200]={0},ts;
     //定义变量用于计数
     int i,j,k=0;
     //Input
     scanf("%s",&Raw);
     scanf("%s",&Incert);
     scanf("%c",&ts);
     //开循环依次检测字符
     for(i=0;Raw[i]!=ts&&i<strlen(Raw);i++){
        //既然能到这,说明这个字符在目标字符前面,就加上去
        Data[k]=Raw[i];
        //不加这会会Bug
        k++;
    }
    //上个循环结束时没有读入目标字符,并且i停留在目标字符的下标
    //开循环转移Incert的字符
    for(j=0;j<strlen(Incert);j++){
        Data[k]=Incert[j];
        k++;
    }
    //开循环完成Raw中剩余字符的转移
    for(;i<strlen(Raw);i++){
        Data[k]=Raw[i];
        k++;
    }
    //打印字符串
    printf("%sn",Data);
    return 0;
}

但是发现测试用例中:

     beijing
     123
     j

这一个用例输出会变成beijing123,好像是跟j没有任何关系.在scanf(“%c”,&ts)后面加了一个printf,直接把ts的ASCII值打印出来,为10,经查表,10代表的是换行符………

这是为什么呢?明明应该是j为什么会读入一个换行符?

这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(n)而结束的,这个n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符n,这样第二次的读入函数直接从缓冲区中把n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因!

看过之后,试了一下下面的代码,发现成功读取并通过!

/**********版权声明**************
本博客展出的代码均为Jerry原创,转载请注明
严禁使用本博客的内容代替作业,算法可以借鉴
但不要连变量名都不改的就抄走!
*******************************/
#include <stdio.h>
#include <string.h>
int main() {
     //定义变量用于存储
     char Raw[100],Incert[100],Data[200]={0},ts;
     //定义变量用于计数
     int i,j,k=0;
     //Input
     scanf("%s",&Raw);
     scanf("%s",&Incert);
     //在%c前加一个n冲掉上一个scanf剩下的换行符......
     scanf("n%c",&ts);
     //开循环依次检测字符
     for(i=0;Raw[i]!=ts&&i<strlen(Raw);i++){
        //既然能到这,说明这个字符在目标字符前面,就加上去
        Data[k]=Raw[i];
        //不加这会会Bug
        k++;
    }
    //上个循环结束时没有读入目标字符,并且i停留在目标字符的下标
    //开循环转移Incert的字符
    for(j=0;j<strlen(Incert);j++){
        Data[k]=Incert[j];
        k++;
    }
    //开循环完成Raw中剩余字符的转移
    for(;i<strlen(Raw);i++){
        Data[k]=Raw[i];
        k++;
    }
    //打印字符串
    printf("%sn",Data);
    return 0;
}

看来以后scanf连着用于读取字符串要小心咯~~

老规矩,贴图!

AC
 手机扫描左边的二维码,立刻将文章收入手机!
 微信扫描左边二维码,点击右上角即可分享到朋友圈!
严禁任何非授权的采集与转载,转载须经站长同意并在文章显著位置标注本文连接,站长保留追究法律责任的权利.

评论

 您需要 先登录 才可以回复.