Как получить доступ к строке из указателя, возвращенного функцией в C - PullRequest
0 голосов
/ 04 июля 2018

У меня есть функция, возвращающая указатель на строку в C, и я пытаюсь получить доступ ко всей строке, но я не знаю, как это сделать.

У меня есть функция, которая зацикливает бросает связанный список структур, содержащих данные ученика, и получает имена ученика. Я хочу заполнить пробелы на концах каждой строки, чтобы они все были одинакового размера. Поэтому я написал функцию для заполнения строк. Функция возвращает указатель на строку, но я не знаю, как получить доступ ко всей строке из указателя. Я знаю, что могу поставить * pstring, чтобы получить первый символ строки, но я немного растерялся, как получить остальные.

Это перебирает связанный список:

void myFunction(void) {

    pStudent = pHead;
    char paddedName[30];
    long nameLength = 0 ;

    while(pStudent->pNext != NULL){
        printf("%c,\n", *padstring(pStudent->name));
        strcpy(paddedName, padstring(pStudent->name));
        nameLength = strlen(paddedName);
        printf("%lu | %s | %s \n", nameLength, paddedName, pStudent->name);
        pStudent = pStudent->pNext;
    }
    printf("\n");

}

Это дополняет и возвращает строку:

char *padstring(char* string){

    char name[30];
    int i = 0;

    while(i < 30){
        if(i < strlen(string)){
            name[i] = string[i];
                    }
        else{
            name[i] = ' ';
        }
        i++;
    }
    printf("%s,\n", name);
    return name;

}

Ответы [ 5 ]

0 голосов
/ 04 июля 2018

Нет необходимости определять новую функцию в вашем случае. Просто используйте sprintf(), чтобы заполнить строку пробелами.

void myFunction(void) {

    // Declare max length of name
    const int MAX_LEN = 29;

    pStudent = pHead;
    char paddedName[MAX_LEN + 1];
    long nameLength = 0 ;

    while(pStudent->pNext != NULL){
        // Record origin length
        nameLength = strlen(pStudent->name);
        // Just write spaces after pStudent->name
        sprintf(pStudent->name + nameLength, "%-*s", MAX_LEN - nameLength, "");

        nameLength = strlen(pStudent->name);
        printf("%lu | %s | %s \n", nameLength, paddedName, pStudent->name);
        pStudent = pStudent->pNext;
    }
    printf("\n");

}
0 голосов
/ 04 июля 2018

Я обычно предпочитаю делать отступы в одной строке. Конечно, вы должны убедиться, что есть достаточно места, что вы можете сделать, передав максимальный размер. Я передаю длину площадки, чтобы сделать ее более гибкой. Это может быть улучшено путем передачи символа, который вы хотите дополнить, если он не всегда является пробелом.

Это быстрый пример.

#include <string.h>
#include <stdio.h>

char* padstring(char *s, int maxlen, int padlen)
{
    int len = strlen(s);

    if (len < padlen)
    {
        char *p = s + len;
        while ((len < maxlen) && (len < padlen))
        {
            *p++ = ' '; // Add a space
            *p = 0;     // Null terminate
            len++;
        }
    }

    return s;
}

int main(int argc, char *argv[])
{
    char s[50] = "Hello";

    printf("'%s'\n", padstring(s, sizeof(s), 30));
    return 0;
}
0 голосов
/ 04 июля 2018

Вам необходимо динамически выделить name в padstring(), если вы хотите вернуть эту память вызывающей стороне.

char *name = malloc(30);
if (name == NULL) {
    return NULL;
}
0 голосов
/ 04 июля 2018

Во-первых, вам нужно завершить строки. Во-вторых, вам нужно создать массив в куче, используя malloc (не забудьте освободить память, когда закончите с ней).

0 голосов
/ 04 июля 2018

Нет необходимости создавать новую строку. Вы можете вывести строку с правой длиной до определенной длины, используя указанный ниже форматный спецификатор (например: %-30s для правой клавиши до 30 символов):

printf("[%-10s]", name);

/* [Name      ] */

Если вы создадите новую строку, вы захотите вернуть действительное место в памяти. Вместо того, чтобы возвращать указатель на локальный стек, используйте malloc для выделения памяти и запомните free, когда закончите с ней (или передайте массив, выделенный в стеке вызывающей стороной).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...