从c中的结构中读取文本

时间:2011-05-29 23:28:24

标签: c data-structures

struct Text{
       int length;
       char *txt;
};
void print(struct Text myTxt)
{
     while ( myTxt.txt < myTxt.txt + myTxt.length )
     {
           printf("%c", ++myTxt.txt);
     }
}
int main()
{
    struct Text myText;
    char test[] = "long long test text";

    myText.length = sizeof (test) / sizeof (char);
    myText.txt = test;

    print(myText);

    gets();
    return 0;
}

我知道打印功能有问题,但是如何修复它。

5 个答案:

答案 0 :(得分:3)

您的问题是print修改传递给它的结构。具体来说,要打印每个字符,您需要递增myTxt.txt然后打印它。您的while循环也不正确:如果myTxt.txt < myTxt.txt + myTxt.length大于零,myTxt.length将始终为真。

你可以这样解决:

void print(struct Text myTxt)
{
     char *txt = myTxt.txt;
     while ( txt < myTxt.txt + myTxt.length )
     {
           printf("%c", *txt++);
     }
}

这会将txt设置为myTxt.txt,因此您无需修改​​txt即可修改myTxt.txt

答案 1 :(得分:2)

假设myTxt.length大于零,myTxt.txt < myTxt.txt + myTxt.length始终为真。

所以你的while循环永远不会终止。

[编辑]

好吧,我想它会在添加溢出int后终止。可能还不是你想要的。

答案 2 :(得分:2)

这应该没问题:

void print(struct Text myTxt) {
    printf("%s", myTxt.txt);
}

(这当然要求myTxt.txt以空值终止,但对于c字符串,这是常见的。)

因此,除非您的字符串应该能够包含额外的空字节,否则您可以将代码更改为:

struct Text{
       char *txt;
};
void print(struct Text myTxt)
{
    printf("%s", myTxt.txt);
}
int main()
{
    struct Text myText;
    myText.txt = "long long test text";
    print(myText);
    return 0;
}

你可以通过调用
来获得字符串的长度 strlen(myTxt.txt);
IIRC要求:
#include string.h

答案 3 :(得分:2)

尝试:

void print(struct Text myTxt)
{
     int i = 0;
     while (i < myTxt.length )
     {
           printf("%c", myTxt.txt[i]);
           i++;
     }
}

你做错了什么:你打印了每个角色的地址,然后递增它。

mytxt.txt正在做的是mytxt.txt = mytxt.txt + 1;,因此当你检查while循环的参数时,你正在创建一个无限循环。

答案 4 :(得分:1)

如果需要支持NULL字节:

#include <ctype.h>
#include <stdio.h>
void print(struct Text *myTxt)
{
    int i;
    for (i = 0; i < myTxt->length; i++)
    {
        if (isprint(myTxt->txt[i]))
        {
            printf("%c", myTxt->txt[i]);
        }
        else
        {
            int num = (int)((unsigned char)myTxt->txt[i]);
            printf("\\%x", num);
        }
    }
}

如果你不这样做:

#include <stdio.h>
void print(struct Text *myTxt)
{
    printf("%s", myTxt->txt);
}