Как получить определенную часть строки? - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь создать программу, которая получает объявление от пользователя (например: int x или char idan), а затем открывает новый файл и записывает в него размер, необходимый для выделения памяти для объявления.

Я получил почти все, даже в случае, когда пользовательское объявление заполнено пробелами, но мне трудно получить строку с именем переменной.

Я хочу создать функцию, которая будет копировать в новую строку с именем var_name только имя переменной и будет возвращать ее. Как я могу это сделать?

* Обновление - 5/9/18

эй, я нашел способ скопировать только часть строки:

strncpy(var_name, &declaration[7], count);
var_name[count + 1] = '\0';

теперь, когда я возвращаю var_name (var_name это строка) все возвращается нормально, но когда я отправляю его в другую функцию, он становится мусором ...

1 Ответ

0 голосов
/ 09 мая 2018

Не используйте strncpy, он не делает то, что вы думаете: https://randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already/

В вашем случае, если предположить, что var_name достаточно большой, по крайней мере, count + 1 байт, простой вызовв memcpy(var_name, declaration + 7, count) было бы лучше.

Вы, вероятно, допустили еще одну ошибку в своем коде (которую вы не публиковали): вы не можете вернуть адрес локального массива, доступ к его содержимому после возврата имеет неопределенное поведение.

Вот простая функция, которую вы можете использовать для выделения и копирования части строки:

#include <stdlib.h>
#include <string.h>

char *substr(const char *s, size_t pos, size_t len) {
    char *p = malloc(len + 1);
    if (p) {
        memcpy(p, s + pos, len);
        p[len] = '\0';
    }
    return p;
}

Используйте ее следующим образом:

#include <stdio.h>

int main() {
    char *p1 = substr("Hello world\n", 0, 5);
    char *p2 = substr("Hello world\n", 6, 5);
    printf("%s %s\n", p1, p2);
    free(p1);
    free(p2);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...