标题:一个关于串赋值的错误...
只看楼主
命运Z魔方
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2016-10-10
结帖率:66.67%
 问题点数:0 回复次数:7 
一个关于串赋值的错误...
如题
自己看书上例子的时候试着敲了一下代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OVERFLOW -1
#define OK 1
typedef struct{
    char *ch=NULL;
    int len;
}HString;

int StrAssign(HString *s,char src[]){
    char *dp=NULL,*sp=src;
    int len=strlen(src);
    dp=(char*)malloc(sizeof(char)*len);
    if(!dp)
    return OVERFLOW;
    if(s->ch)
    free(s->ch);
    s->ch=dp;
    if(*sp)
    *dp++=*sp++;
    return OK;
}
int main(){
    char src[255]="asdghwajkgnh";
    HString *s;
    printf("执行字符串赋值\n");
    if(StrAssign(s,src)==OK)
    printf("%s,执行完毕\n",s->ch);
    else if(StrAssign(s,src)==OVERFLOW)
    printf("字符串空间溢出\n");
    return 0;
}

结果调试的时候出现了“Program received signal SIGSEGV,Segmentation fault.”这个....
有没有大佬指点一下是咋回事啊..
搜索更多相关主题的帖子: 赋值 include char int return 
2017-11-26 21:01
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
typedef struct{
    char *ch=NULL;
     int len;
 }HString;

DO IT YOURSELF !
2017-11-26 21:26
命运Z魔方
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2016-10-10
得分:0 
回复 2楼 wp231957
啊,啥意思啊...我就是这样写的啊...还是错到这了的意思啊
2017-11-27 12:26
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
s未定义

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OVERFLOW -1
#define OK 1
typedef struct
{
    char *ch;
    int len;
} HString;

int StrAssign(HString *s,char src[])
{
    char *dp=NULL,*sp=src;
    int len=strlen(src);
    dp=(char*)malloc(sizeof(char)*len);
    if(!dp)
        return OVERFLOW;
    if(s->ch)
        free(s->ch);
    s->ch=dp;
    while ((*dp++=*sp++)!='\0') NULL;
    return OK;
}
int main()
{
    char src[255]="asdghwajkgnh";
    HString s={0};
    printf("执行字符串赋值\n");
    if(StrAssign(&s,src)==OK)
        printf("%s,执行完毕\n",s.ch);
    else if(StrAssign(&s,src)==OVERFLOW)
        printf("字符串空间溢出\n");
    return 0;
}
2017-11-27 14:39
不哈体
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-11-27
得分:0 
借楼 不好意思啊
问题:有10个人的身高分别为:165cm,158cm,163cm,176cm,155cm,159cm,170cm,180cm,和173cm,他们的编号分别是1―10,
求:(1)这10个人的平均身高
       (2)这10个人中的最大身高和他的编号
2017-11-27 14:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
typedef struct{
    char *ch=NULL;
     int len;
 }HString;

这是C++的语法,而明显你的代码是C式的
其它的错误还有
1. 长度类型应该用 size_t,不要学那些化外猴子
2. 布尔值类型可以用内建的_Bool,如果看名字不爽,可以#include <stdbool.h>后用 bool/true/false
3. int StrAssign(HString *s,char src[]) 中第二个参数明显不需要可修改,就应该加上const修饰
4. 变量在需要时才应该定义,不要学那些不肯进化成人类的猴子
5. strlen的返回值是不包括结尾的'\0'的
6. dp=(char*)malloc(……);  C语言中就是为了避免malloc写出冗余的强制类型转换才规定void*可隐式转化为其它指针类型
7. free(NULL) 是合法的,不需要判断
8. if(*sp) *dp++=*sp++; 我猜你是想用 while 吧。第二个问题,为什么前面用了strlen,这里却不肯用strcpy?
9. int main() 应该是 int main( void ),C语言和C++语言对无参数列表的规定是不一样的
10. HString *s; 中以后使用s,但s根本没赋值
11. if(StrAssign(s,src)==OK) …… else else if(StrAssign(s,src)==OVERFLOW) 你不觉得 StrAssign(s,src) 被重复执行了吗?

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

typedef struct
{
    char *ch;
    size_t len;
} HString;

void StrConstructor( HString* s )
{
    s->ch = NULL;
}

bool StrAssign( HString* s, const char* src )
{
    size_t len = strlen(src);
    char* ch = malloc( len+1 );
    if( !ch )
        return false;
    strcpy( ch, src );

    free( s->ch );
    s->ch = ch;
    s->len = len;
    return true;
}

int main( void )
{
    const char* src = "asdghwajkgnh";
    HString s;
    StrConstructor( &s );

    printf("执行字符串赋值\n");
    bool result = StrAssign(&s,src);
    if( result )
        printf( "%s,执行完毕\n", s.ch );
    else
        puts( "字符串空间溢出" );

    return 0;
}



2017-11-27 15:00
命运Z魔方
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2016-10-10
得分:0 
回复 6楼 rjsp
自己看的书上的一些例子,有的地方没弄清楚就原搬了...谢谢大佬指点
2017-11-27 21:36
命运Z魔方
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2016-10-10
得分:0 
回复 4楼 吹水佬
谢谢大佬
2017-11-27 21:39



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




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

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