Как назначить указатель на глобальную переменную? - PullRequest
0 голосов
/ 21 февраля 2011

Мне нужно разделить аргумент командной строки, чтобы определить тип файла. Для этого я использую

char fileName; //global variable, just below function prototypes

char *fileType;

fileType= strtok(inputFile, "."); //first string split
fileName= (int) &fileType; //store the file name for further use

fileType= strtok(NULL, "."); //get the file type

Функция токенизатора работает, но в целях минимизации избыточного кода я хочу сохранить имя файла, так как позже мне потребуется создать новый файл с тем же именем, но другим расширением. *

В отладчике переменная fileName никогда не используется. Почему?

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

О

char fileName; //global variable, just below function prototypes

если fileName предполагается как строка, то это должен быть указатель на первый char в этой строке (т.е. char *fileName).

если fileName является указателем на строку, то он должен быть объявлен как char **fileName.


О

char *fileType;

если это локальная переменная, а fileName - указатель на нее, то после возврата функции она будет уничтожена, а указатель укажет на неизвестные данные.


О

fileName= (int) &fileType; //store the file name for further use

мне это кажется бессмысленным. Зачем приводить адрес fileType к целому числу? Я думаю, компилятор жаловался, потому что fileName это char, а не char *, и вы заметили, что это исправит ошибку. Не делайте такого рода исправлений, не понимая, что вы делаете, потому что подобное программирование просто приводит к эзотерическому коду, который, вероятно, в любом случае не будет работать должным образом.

Итак, если fileName определено как char *, просто выполните fileName = fileType. Иначе, если fileName объявлено как char **, тогда выполните fileName = &fileType;


О

fileType= strtok(NULL, "."); //get the file type

если strtok() может вернуть указатель на новую строку, а fileName объявлен как char *, то все, что вы сохранили в нем ранее, не будет иметь смысла В этом случае fileName должен быть char ** (указатель на строку), который я предложил в своем первом комментарии.

0 голосов
/ 21 февраля 2011

Вам необходимо использовать массив char вместе с strcpy.

Как это:

#define MAX_FILENAME_SIZE 200
char fileName[MAX_FILENAME_SIZE];

int f()
{
    fileType = strtok(inputFule, ".");
    // then use strcpy
    strcpy(fileName, fileType);

}

A char global будет хранить только один символ.

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