Читать текст из структуры в c - PullRequest
1 голос
/ 30 мая 2011
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 ]

3 голосов
/ 30 мая 2011

Ваша проблема 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++);
     }
}

Это устанавливает *От 1011 * до myTxt.txt, поэтому вы можете изменить txt без изменения myTxt.txt.

2 голосов
/ 30 мая 2011

Попробуйте:

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.

2 голосов
/ 30 мая 2011

Это должно быть в порядке:

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

2 голосов
/ 30 мая 2011

Если myTxt.length больше нуля, myTxt.txt < myTxt.txt + myTxt.length всегда верно.

Так что ваш цикл while никогда не завершается.

[редактировать]

Что ж, я полагаю, это прекращается, когда сложение переполняет int. Тем не менее, вероятно, не то, что вы хотели.

1 голос
/ 30 мая 2011

Если вам нужно поддерживать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...