有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串

我下面打的这个怎么不能通过、
求修改、

#include<stdio.h>
int n,m;
char str[100],string[100];
void a(str)
{
int t=0,i;
for(i=m-1;i<n;i++)
{
string[t]=str[i];
printf("%c",string[t]);
t++;}
}
int main()
{
scanf("%d",&n);
gets(str);
scanf("%d",&m);
a(str);
return 0;
}

#include&lt;iostream&gt;

using namespace std;

int main()

{

void copy1(char*str1,char*str2,int m);//函数声明

int m;

char str1[20],str2[20];//定义两个字符数组

cout&lt;&lt;"请输入字符串:"&lt;&lt;endl;

gets(str1);//输入字符串

cout&lt;&lt;"您想从第几个字符开始复制:"&lt;&lt;endl;

cin&gt;&gt;m;

if(strlen(str1)&lt;m)//调用字符串长度函数

{

cout&lt;&lt;"输入错误!"&lt;&lt;endl;

}

else

{

copy1(str1,str2,m);//调用复制函数

cout&lt;&lt;"复制后为:"&lt;&lt;str2&lt;&lt;endl;

}

return 0;

}

void copy1(char*str1,char*str2,int m)

{

int n=0;

while(n&lt;m-1)//当n&gt;=m-1时,循环结束

{

n++;

str1++;//让str字符串从第m个开始

}

while(*str1!='\0')

{

*str2=*str1;//从第一个字符串的第m个元素开始复制到第二个字符串

str1++;

str2++;

}

*str2='\0';

}

扩展资料:

include用法:

#include命令预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置;可以标识出只有在特定条件下才会被编译的某一段程序代码;可以定义类似标识符功能的宏,在编译时,预处理器会用别的文本取代该宏。

插入头文件的内容

#include命令告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。有两种方式可以指定插入头文件:

1、#include&lt;文件名&gt;

2、#include"文件名"

如果需要包含标准库头文件或者实现版本所提供的头文件,应该使用第一种格式。如下例所示:

#include&lt;math.h&gt;//一些数学函数的原型,以及相关的类型和宏

如果需要包含针对程序所开发的源文件,则应该使用第二种格式。

采用#include命令所插入的文件,通常文件扩展名是.h,文件包括函数原型、宏定义和类型定义。只要使用#include命令,这些定义就可被任何源文件使用。如下例所示:

#include"myproject.h"//用在当前项目中的函数原型、类型定义和宏

你可以在#include命令中使用宏。如果使用宏,该宏的取代结果必须确保生成正确的#include命令。例1展示了这样的#include命令。

【例1】在#include命令中的宏

#ifdef _DEBUG_

#define MY_HEADER"myProject_dbg.h"

#else

#define MY_HEADER"myProject.h"

#endif

#include MY_HEADER

当上述程序代码进入预处理时,如果_DEBUG_宏已被定义,那么预处理器会插入myProject_dbg.h的内容;如果还没定义,则插入myProject.h的内容。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-25

#include<stdio.h>

int n,m;

char str[100],string[100];

void a(char str[])

{

int t=0,i;

for(i=m-1;i<=n;)                /*改写了,更为简洁*/

  string[t++]=str[i++];

}

int main()

{

gets(str);

n=strlen(str);            /*用此系统函数来求取str的串长度更为方便、可靠*/

scanf("%d",&m);

a(str);

puts(string);

return 0;

}

本回答被网友采纳
第2个回答  推荐于2018-02-26

改成如下,可运行:

#include<stdio.h>

int n,m;
char str[100],string[100];

void a(char *str)    //此str并非str[100],两者之间没有关系
{                    //建议你重新捋一捋函数形参,指针,数组的内容。
        int t=0,i;
        i=m-1;
        str=str+i;
        for(;i<n;i++)
        {
                string[t]=*str;
                printf("%c",string[t]);
                str++;
                t++;
        }
}

int main()
{
        printf("input n:\n");
        scanf("%d",&n);

        printf("input str:\n");
        scanf("%s",str);        //这里我没有用gets()函数,换成scanf()了。

        printf("input m:\n");
        scanf("%d",&m);

        a(str);
        return 0;
}

======================================

整体来说,你这个程序这样设计是存在问题的,比如:n=10,但str[100]里存放的字符个数却少于10个,就会产生错误。

追问

那我那个怎么不行、
我把形参和实参同一个名字str

追答

把形参和实参同一个名字是可以的。这样的话,你原来代码中的第四条语句void a(str)改为void a(char str[100])就可以了。
我上面那个改动太大了一些。
========================
不过,不建议使用gets( )函数,因为它本身的实现存在安全问题,当你输入的字符个数超过数组str的长度时,gets()会把后面多出的字符继续在str后面的空间中存储,这样很危险。

追问

void a(char str[100])
{int t=0,i;
for(i=m-1;i<n;i++)
{string[t]=str[i];
printf("%c",string[t]);
t++;} }
int main()
{char str[100];
scanf("%d",&n);
gets(str);
scanf("%d",&m);
a(str);
return 0;}
输不出

追答

把gets(str);改成scanf("%s",str);再运行看。
==================================
我这边也是使用gets(str);的时候不行,改用scanf("%s",str);则没有问题。

本回答被网友采纳
相似回答