这是很简单的一个题目,谭浩强c语言第五版第八章课后题
如下是我的代码
#include <stdio.h>
int main(){
void copy(char *str1,char *str2,int n,int m);
char str1[50];
char str2[50];
int m,n=0;
printf("please enter n");
scanf("%d",&n);
printf("please enter m");
scanf("%d",&m);
for (int i = 0; i < n; ++i) {
scanf("%c",&str1[i]);
}
copy(str1,str2,n,m);
puts(str2);
}
void copy(char *str1,char *str2,int n,int m){
for (int i = m-1; i < n; ++i) {
*(str2+i-m+1)=*(str1+i);
}
str2[n-m+1]='\0';
}
运行后却发现得到了如上的结果,经过debug发现问题是:在输入m后的 回车键 在缓存中被scanf%c 读取进数组str1作为了str【0】
修改输
入语句为:scanf("%s",str1); 解决
#include <stdio.h>
int main(){
void copy(char *str1,char *str2,int n,int m);
char str1[50];
char str2[50];
int m,n=0;
printf("please enter n");
scanf("%d",&n);
printf("please enter m");
scanf("%d",&m);
scanf("%s",str1);
copy(str1,str2,n,m);
puts(str2);
}
void copy(char *str1,char *str2,int n,int m){
for (int i = m-1; i < n; ++i) {
*(str2+i-m+1)=*(str1+i);
}
str2[n-m+1]='\0';
}
或者吞掉\n 加上一行即可
scanf("%d",&m);
scanf("%c",&str1[0]);
for (int i = 0; i < n; ++i) {
scanf("%c",&str1[i]);
}
总结:用%c输入时不论键盘敲击什么进去都会按顺序读写进去(空格 回车)
下面尝试用gets方法输入:
直接输入 发现错误,控制台直接跳过gets()方法,显示如下:
经过排查原因:输入m后的空格被gets()方法直接读取进去
printf("please enter m");
scanf("%d",&m);
scanf("%c",&str1[0]);
// for (int i = 0; i < n; ++i) {
// scanf("%c",&str1[i]);
// }
gets(str1);
加上一行scanf(%c)消化\n后 解决