| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 311 人关注过本帖
标题:求助:数组字符串的打印问题 估计'\0'的原因
只看楼主 加入收藏
tane05
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-12-28
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:2 
求助:数组字符串的打印问题 估计'\0'的原因
程序代码:
#include<stdio.h>
#include<stdlib.h>

typedef struct

{
    char *data;
    int length;
}SqString;

void Pri_String(SqString *str);
int StrAssign(SqString *Sq,char *ch);
SqString Concat(SqString S,SqString T);

int main()
{
   

    SqString str1;
    SqString str2;
    SqString *p=&str1;
    SqString *q=&str2;
    StrAssign(p,"Hello");
    StrAssign(q,"olleH");
    Pri_String(p);
    Pri_String(q);
    SqString str3=Concat(str1,str2);
    SqString *str=&str3;
    Pri_String(str);
    return 0;
}
int StrAssign(SqString *Sq,char *ch)
  /*由串常量ch创建串sq*/

{

    char *flag=ch;
    int len;

    while(*flag!='\0')
        flag++;
    len=flag-ch;
    Sq->data=(char *)malloc((len+1)*sizeof(char));

    if(Sq->data==NULL)
    {
        printf("Apply space is not succesed!");
        exit(0);
    }
    flag=Sq->data;
    while(*flag++=*ch++)
        ;
    *flag='\0';
    Sq->length=len;
    printf("1\n");
    return 0;
}

void Pri_String(SqString *str)
//打印函数
{
   

/*    SqString *index=str;
    while(*index->data!='\0')
    {
        printf("%c",*index->data);
        index->data++;
    }                                

    printf("  ");                     // 困惑1  ??
    printf("%d\n",str->length);      //使用这段打印代码 最后的一个Pri_String(str)调用
    printf("here\n");   */             //打印的应该是HelloolleH 但事实上打印的是空的 求解释 谢谢???


    printf("%s\n",str->data);          //困惑2
    printf("%d\n",str->length);         //使用这段代码答应 出现的结果HelloolleH?  这个?号 求解释?
    printf("\n");
}

SqString Concat(SqString S,SqString T)
/*将串T连接到串S后*/
{
    SqString str;
    str.length=S.length+T.length;
    str.data=(char *)malloc((str.length+1)*sizeof(char));
    for(int i=0;i<S.length;i++)
        str.data[i]=S.data[i];
    for(i=0;i<T.length;i++)
        str.data[S.length+i]=T.data[i];
    str.data[str.length+1]='\0';                

    return str;
}
搜索更多相关主题的帖子: 字符串 
2011-06-11 22:40
tane05
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-12-28
收藏
得分:0 
有疑问的地方都注释了  求高手解答下 谢谢!
2011-06-11 22:41
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:5 
程序代码:
void Pri_String(SqString *str) {
    // SqString * index = str;                // 这样的话修改 index->data 就会修改 str->data
    SqString index = *str;                    // 改成这样
    while(*index->data!='\0')
    {
        printf("%c",*index->data);
        index->data++;
    }                                
    printf("%d\n",str->length);               //使用这段代码答应 出现的结果HelloolleH?  这个?号 求解释?
    printf("\n");
}
// 由于楼主分别对 str1 和 str2 调用错误的 Pri_String 函数,而且在 Pri_String 函数执行结束后,data 已经指向了表示字符串结束的 '\0'
// 所以最后连接出来的字符串自然是一个空字符串。

SqString Concat(SqString S,SqString T) {
    SqString str;
    int i;
    str.length = S.length + T.length;
    str.data = (char *) malloc((str.length + 1) * sizeof(char));
    for (i = 0; i < S.length; i++)
        str.data[i] = S.data[i];
    for(i = 0; i < T.length; i++)
        str.data[S.length + i] = T.data[i];
    str.data[str.length] = '\0';    // 这里不必 + 1。而这里 + 1 就是楼主最后多出一个 ? 的原因
    return str;
}


ps:c99 要少用。另外,在 C 语言中,标识符不要同时出现 _ 和大写字母。个人偏好使用 _

[ 本帖最后由 voidx 于 2011-6-11 23:21 编辑 ]
2011-06-11 23:17
快速回复:求助:数组字符串的打印问题 估计'\0'的原因
数据加载中...
 
   



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

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