2016-11-05 3 views
-2

Здравствуйте, я только начал программировать на C, и я пытаюсь прочитать файл и дать имя файла в качестве аргумента без конечного .txt. Я хочу добавить .txt в свой код: ./myexample.exe fileдобавить строку в заданный аргумент командной строки в C

если я использую file.txt, нет проблем, но я не знаю, как изменить argv [1] i try char * n = argv [ 1] + ".txt"; оно не работает, и я не знаю, что-нибудь еще ..

int main(int argc, char* argv[]) { 
     char *n = argv[1] +".txt"; 
     FILE *fp1; 
     fp1 = fopen(n , "r"); 

То, что я получу, если я использую char *n = argv[1]+".txt"

error: invalid operands to binary + (have 'char *' and 'char *')

+0

Возможный дубликат [Как объединить строки const/literal в C?] (Http://stackoverflow.com/questions/308695/how-to-concatenate-const-literal-strings-in-c) – UnholySheep

+1

1) Указатель не является строкой! 2) Указатель не является массивом. 3) C не имеет отдельного строкового типа. – Olaf

ответ

0

Вы не можете объединить строки с +. Использовать strcpy и strcat:

char n[256]; 
strcpy(n, argv[1]); 
strcat(n, ".txt"); 

Убедитесь, что n достаточно велико, чтобы сохранить имя файла + расширение.

+2

100 не достаточно большой, чтобы хранить любое имя файла. Нужно, по крайней мере, 256 для хранения любого имени файла в Linux, например. – Chris

+0

Спасибо за подсказку – yassin

+0

Возможно, было бы разумно проверить, подходит ли строка в буфере перед копированием. – Chris

3

В коде

char *n = argv[1] +".txt"; 

не делать то, что вы думаете оно делает. В C + не может использоваться для объединения строк.

FYI, из C11, глава §6.5.6

For addition, either both operands shall have arithmetic type, or one operand shall be a pointer to a complete object type and the other shall have integer type. (Incrementing is equivalent to adding 1.)

Оба операнда не могут быть указатель на объект типа.

Если вы имели в виду конкатенировать строки используйте strcat() но убедитесь

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

Это своего рода раздражает, чтобы сделать безопасно: вам нужно быть осторожным, чтобы сделать достаточно большой массив char, чтобы провести целую цепочку. Один из способов:

size_t arglen=strlen(argv[1]); 
char* filename=malloc(arglen+5); //Enough to hold the whole string 
strcpy(filename,argv[1]); 
strcat(filename,".txt"); 

Обязательно free указатель позже.