标题:拷贝字符串的代码,为什么输出不了。直接报错闪退
只看楼主
a83342358
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2018-4-9
结帖率:66.67%
已结贴  问题点数:20 回复次数:5 
拷贝字符串的代码,为什么输出不了。直接报错闪退
程序如下,新手求大佬教导
#include <stdio.h>
char *FUN(char *x,char *y)
{
    char *p=y;
    for(;*x!='\0';x++,y++)
    {
        *y=*x;
    }
    *y='\0';
    return p;
}

int main()
{
    char *s,*q;char a[100];
    gets(a);
    s=a;
    q=FUN(s,q);
    puts(q);
    return 0;
}
搜索更多相关主题的帖子: 拷贝 字符串 输出 报错 char 
2018-04-09 10:26
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:7 
q没分配内存,是野指针
2018-04-09 10:52
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:7 
回复 楼主 a83342358
先不说其它问题,就说一下strcpy其实是一个不安全的函数,因为没有对其数组长度进行检测(如果被复制数组的长度小于原来复制的字符串长度就见笑了),所以较为安全可以用strncpy,或者linux系统下还有更为安全的strlcpy函数,所以被复制字符串预留的空间分配问题要注意一下~

还有顺便提一下gets函数和strcpy函数类似存在这样的安全性问题,可以用fgets代替gets~




[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-09 10:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
简单写了个例子(当然对数组越界还是没有进行检查,使用的时候还是要注意数组越界这个情况的)~

简单的可以看看这个~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char* fun( char*,const char* );

int main( void )
{
    #define MAX 100
    
    char s[MAX];
    char p[MAX];

    fgets(s,sizeof (s),stdin);
    
   s[strcspn(s,"\n")]='\0';
       
   fun(p,s);

    puts(p);
    
    return 0;
    
    #undef MAX
}

char* fun( char* p,const char* q )
{
    const char* s=q;
    
    if (!p||!q)
        return ( char* )s;
        
    while (*p++=*q++);
                
    return ( char* )s;
}


这个用了达夫设备,试过可以用了~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char* fun( char*,const char*,size_t size );

int main( void )
{
    #define MAX 100
    
    char s[MAX];
    char p[MAX];

    fgets(s,sizeof (s),stdin);
    
   s[strcspn(s,"\n")]='\0';
       
   fun(p,s,strlen(s)+1);

    puts(p);
    
    return 0;
    
    #undef MAX
}

char* fun( char* p,const char* q,size_t size )
{
#ifndef DUFF_DECIVE
#define DUFF_DECIVE(NUM,E,IS_END)    \
    do    \
    {    \
        size_t _Duff_Decive_Time=(~-NUM)>>3;    \
        \
        if (NUM>0)    \
            switch (NUM&7)    \
            {    \
                do    \
                {    \
                    case 0:    E    \
                    case 7:    E    \
                    case 6:    E    \
                    case 5:    E    \
                    case 4:    E    \
                    case 3:    E    \
                    case 2:    E    \
                    case 1:    E    \
                }while     \
                (    \
                _Duff_Decive_Time-->0##IS_END    \
                );    \
            }    \
    }while (0)
#endif

   const char* s=q;

    if (!p||!q)
        return ( char* )s;
    
    DUFF_DECIVE(size,if (!(*p++=*q++))break;,&&*(q-1));
                
    return ( char* )s;
    
    #undef DUFF_DECIVE
}


[此贴子已经被作者于2018-4-9 22:16编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-09 11:18
yuandefeng
Rank: 4
等 级:业余侠客
威 望:3
帖 子:51
专家分:216
注 册:2017-11-28
得分:7 
以前写过一个作业就是复制指定长度的字符串到另外一个数组。正好拿来,顺便给路过的大神看看有没有漏洞。。。
程序代码:
/*********************************************************************
* title:    write a function "mystrncpy()",just as strncpy() do .
*
* C primer Plus  charpter 11 exerices 11-13-07
*********************************************************************/

#include <stdio.h>
#include<string.h>
#define LEN 80
char *get_string(char *s2,int n);
int get_int(void);
char *mystrncpy(char *s1,char *s2,int n);
int main (void)
{
    char ch,s1[LEN],s2[LEN];
    char *pt_s1,*pt_s2;
    int n;
    puts("do copy from s2 to s1 ?y/n?");
    while(ch = getchar() == 'y')
    {
        while(getchar()!= '\n')
            continue;
        puts("Input a string,limited by 80 characters,or use '#' to end.:");
        pt_s2 = get_string(s2,LEN);
        if(s2 == NULL)
            puts("receive failed.");
        else
        {
            puts("The string received is:"); //show the strings.
            puts(pt_s2);

            printf("Now,set how many characters to copy.\n");
            n = get_int();
            printf("copy %d characters of s2 to s1\n",n);
            pt_s1 = mystrncpy(s1,s2,n);

            printf("Now,s1[%d] = ",n);
            puts(pt_s1);
            while(getchar() != '\n')
                continue;
        }
        puts("Try again? y / n ? or input # to quit!");
    }
    puts("DONE!");
return 0;
}

char *get_string(char *s2,int n)
{
    int ch;
    int i;
    for(i = 0;i < n;i++)
    {
        ch = getchar();
        if(ch != EOF && ch != '#')
            *(s2 + i) = ch;
        else if(ch == EOF)
            return NULL;
        else if(ch == '#')
            break;
    }
    *(s2 + i) = '\0';
    return s2;
}

char *mystrncpy(char *s1,char *s2,int n)
{
    int i,j;
    j = 0;
    for(i = 0;i < LEN;i++)
    {
        if(s2[i] != '\0')
            j++;
        else
            break;
    }
    if (j >= n)
    {
        for(i = 0;i < n;i++)
            s1[i] = s2[i];
        s1[i] = '\0';
        return s1;
    }
    else if(j < n)
    {
        for(i = 0;i < j;i++)
            s1[i] = s2[i];
        s1[i] = '\0';
        return s1;
    }
}

int get_int(void)
{
    int n;
    while(scanf("%d",&n) != 1)
    {
     while(getchar() != '\n')
        continue;
     printf("input is not an integer type value,try again!");
    }
        return n;
}
2018-04-09 21:18
a83342358
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2018-4-9
得分:0 
非常感谢!
2018-04-09 22:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-485881-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025707 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved