9.6 在指定位置中插入字符串
今天突然想写点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连着用于读取字符串要小心咯~~
老规矩,贴图!

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