2014-10-04 4 views
1

Я ищу обработку строки, переданной с помощью аргумента командной строки, с циклом for в C. Мне интересно, правильно ли это будет.Динамически выделенная строка из аргумента командной строки

main(int argc, char * argv[]) 
{ 
    char * somestring; 
    somestring = malloc((strlen(argv[1]) + 1) * sizeof(char)); 
    somestring = argv[1]; 

     ... 
} 

или будет C выделить соответствующую память, если я сделал:

char * somestring; 
somestring = argv[1]; 
+0

Почему бы не использовать 'strcpy'? Почему C будет выделять вам память, если вы не попросите об этом? – user1336087

+0

Всё зависит от меня. Вы хотите иметь возможность изменять 'somestring' и сохранять исходный аргумент неповрежденным? Вы просто хотите использовать (без изменения) аргумент? –

+0

Я просто хочу обработать его персонажем символом с циклом for. – anon349

ответ

3

Если вы хотите скопировать аргумент в своей собственной выделенной памяти, то вы должны написать

int main(int argc, char * argv[1]) 
{ 
    char * somestring; 
    somestring = malloc(strlen(argv[1]) + 1); 
    strcpy(somestring, argv[1]); 

     ... 
} 

иначе выписка

somestring = argv[1]; 

приводит к утечке памяти.

Также не забудьте освободить память, когда она больше не понадобится.

Примите во внимание, что хотя эта запись

int main(int argc, char * argv[1]) 

действует лучше написать

int main(int argc, char * argv[]) 

, потому что ваше намерение, указав char * argv[1] не ясно

+4

С другой стороны, не 'malloc'ing вообще и выполнение' somestring = argv [1] 'абсолютно нормально, если вам не нужна копия. – hobbs

+0

@hobbs Да, это так. –

0

Fisrt всего это неправильный способ копирования строки в другую строку. Вы правильно сделали выделение памяти, но ваш метод копирования строки в другую неверен. Вы выделили память для строки и собрали ее адрес в somestring. Теперь вы назначаете argv [1], который является адресом вектора аргументов командной строки, который фактически является 2D-массивом. Поэтому вы должны использовать strcpy() для копирования строки.

Или, если вы хотите, чтобы только базовый адрес строки использовал указатель на символ и назначил ему argv [1]. Но это бесполезно.

P.S. прохождение аргумента командной строки, как вы делаете, не рекомендуется, поскольку все аргументы хранятся в аргументе argv, который является 2D-массивом. Поэтому, если вы передаете только одну строку, это нормально, но если вы передаете несколько строк, вместо этого используйте char ** argv.

+2

Что вы подразумеваете под «argv», являющимся 3D-массивом? Никогда не слышал об этой идее. Также вам не кажется, что для параметров функции 'char * argv [1]', 'char * argv []' и 'char ** argv' являются одинаковыми. –

+0

Но если вы сохраняете свой аргумент только в argv [1], то как вы сможете использовать следующий аргумент? –

+0

Вы не «храните» аргумент в 'argv [1]'. Вам срочно нужно прочитать, как интерпретируются параметры «массива» для функций. Часто задаваемые вопросы C должны быть хорошей отправной точкой. –

1

Если вам нужно сохранить переходную строку, тогда вам нужно выделить память, скопировать ее в новый буфер (через функцию strcpy-like), а затем освободить этот буфер.

Но в этом случае аргументы командной строки не являются временными. Они доступны для всей жизни процесса. Поэтому достаточно просто запомнить указатель на них. Так что-то вроде этого будет достаточно:

const char* firstParameter = nullptr; 

int main(int argc, char* argv[]) 
{ 
    if (argc > 1) firstParameter = argv[1]; 
} 
0

Хороший способ будет выделение памяти для указателя и использовать strcpy функции для копирования содержимого.

Например:

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

int main(int argc, char * argv[]) 
{ 
    char *somestring; 
    if(argv[1] == NULL) 
    { 
     puts("Argument 1 is not specified."); 
     exit(1); 
    } 
    somestring = malloc(strlen(argv[1])+1); 
    strcpy(somestring, argv[1]); 
    printf("%s\n",somestring); 
    return 0; 
} 

Также перед выделением памяти для указателя, сначала проверьте, если argv[1] не NULL.

Смежные вопросы