Получил проект инструмента командной строки C, работающий в Xcode 6, и все отлично работает, кроме одной мелочи: я не могу понять, как присвоить значение массиву переменной длины! Например, рассмотрим следующий код:
#include <string.h>
int main()
{
int len = 10;
char str[len];
strcpy(str, "hello");
printf("%s", str);
}
Это компилируется нормально, но когда я его отлаживаю, массив никогда не назначается! Если я установлю точку останова в строке 7, нажму кнопку запуска и наведу указатель мыши на str
, он просто отобразит это имя со стрелкой рядом с ним, которая при расширении ничего не показывает!
Поправьте меня, если я ошибаюсь, но я считаю, что это совершенно правильный код C99, который я пишу здесь... так что же дает?! Я пробовал компилятор GNU99 (по умолчанию) и компилятор C99, но безрезультатно.
МТС :-)
РЕДАКТИРОВАТЬ: ОК, я, кажется, запутался и, возможно, даже отправил несколько человек здесь (поскольку я получил по крайней мере 3 голоса против этого вопроса), поэтому позвольте мне немного прояснить ситуацию.
На самом деле я пишу приложение libcurl в Mac OS X Yosemite для загрузки файлов на веб-сервер через HTTP. В конце концов, я хочу иметь возможность ввести что-то вроде «загрузить [URL-адрес назначения] [файл или каталог 1] [файл или каталог 2] ... [файл или каталог N]» в Терминале, и моя программа автоматически загрузит эти файлы и каталоги в [адрес назначения]. Введенные пути могут быть относительно CWD или абсолютными.
Проблема существует в моей функции uploadDirectory
, как показано здесь:
void uploadDirectory(CURL* hnd, struct curl_httppost* post,
struct curl_httppost* postEnd, char* path, const char* url)
{
DIR* dir = opendir(path);
if (dir == NULL)
{
printf("\nopendir failed on path \"%s\"", path);
perror(NULL);
}
else
{
struct dirent* file;
while ((file = readdir(dir)) != NULL)
{
// skip the current directory and parent directory files
if (!strcmp(file->d_name, ".") ||
!strcmp(file->d_name, ".."))
continue;
if (file->d_type == DT_REG)
{
// file is an actual file; upload it
// this is the offending code
char filePath[strlen(path) + strlen(file->d_name) + 2];
strcpy(filePath, path);
strcat(filePath, "/");
strcat(filePath, file->d_name);
int res = uploadFile(hnd, post, postEnd, filePath, url);
printf("%d", res);
}
if (file->d_type == DT_DIR)
{
// file is a directory; recurse over it
// this section is omitted for brevity
}
}
closedir(dir);
}
}
Я знаю, что мог бы определить filePath
с огромным постоянным размером, чтобы решить проблему, но насколько большим является слишком большой? Какова максимальная длина пути к файлу в OS X? И т. д., и т. д., поэтому я бы предпочел сделать его точно по размеру.
Если вы выдержали чрезмерную длину этого поста и добрались до него, спасибо за терпение! Сначала я пытался описать проблему как можно короче, но это, очевидно, не вызвало ничего, кроме путаницы, поэтому я прошу прощения за это :-)
printf("hello");
. - person mch   schedule 22.01.2015printf
:printf("output: '%s'\n", test);
- person zaph   schedule 22.01.2015#include <string.h>
? - person Dmitri   schedule 22.01.2015return 0
в концеmain()
. Я запустил его и получил правильный результат. - person Gopi   schedule 22.01.2015printf()
, поэтому вы должны включить<stdio.h>
. - person alk   schedule 24.01.2015filePath
и его использование совершенно правильно. Если код, как показано, дает сбой, основная причина, скорее всего, лежит в другом месте. Известно, что повреждение памяти вызывает несколько иррациональное поведение кода, поэтому вы можете захотеть отладить свою программу с помощью средства проверки памяти, такого как Valgrind (valgrind .org). - person alk   schedule 24.01.2015