LINUX.ORG.RU

C первые шаги


0

0

Вот такой кусок программы:

int main(int argc, char *argv[]) {
	/*** Main function ***/
	char filename[15];
	
	// check argumeents count.
	if (argc>2){
		printf("USAGE: \t./v_cover [filename]\n\n");
		exit(0);
		}
	
	if (argc==2) {
		filename=argv[1]; // Как его туда засунуть??????
		}
	else {
		printf("\nBitte geben Sie den Dateinamen ein, von dem man abgelesen wird:\n"); 
		scanf("%s",&filename);
		printf("\n");
		}
		
	printf ("We are using %s as datasource. \n", filename);
	return 0;
}
anonymous

> filename=argv[1]; // Как его туда засунуть??????

Я так понял, проблема в этом? Тогда есть два варианта:

а) объявить filename так:

char *filename;

Тогда присваивание будет правильным, и после этого filename можно использовать как обычную ASCIIZ-строку без оглядки на размеры буферов.

б) воспользоваться функциями копирования строк типа str(n)cpy:

strcpy(filename, argv[1]);

strncpy(filename, argv[1], sizeof(filename));

В этом случае содержимое argv[1] физически копируется в filename. При этом нужно учесть, что в первом случае размер filename должен быть достаточным, чтобы вместить все содержимое argv[1] вместе с завершающим нулем '\0'. Во втором случае может оказаться, что строка после копирования будет обрезана. Вообще говоря, здесь правильно динамически разместить память для filename:

char filename[];

...

filename = (char *)malloc(strlen(argv[1]) + 1);

Ну и потом, естественно, освободить этот кусок:

free(filename);

Это защищает программу от пресловутых дыр типа "переполнение буфера". Но на самом деле, если не планируется манипулировать с именем файла, лучше все-таки рассмотреть вариант а).

Если второй вариант предпочтительнее, то

man strcpy

man malloc

eugine_kosenko ★★★
()

попробуй strcpy(filename, argv[1]);

anonymous
()

>von dem man abgelesen wird

ы?

anonymous
()
Ответ на: комментарий от eugine_kosenko

da u nego tam uzhe buffer overflow cherez scanf est'

anonymous
()
Ответ на: комментарий от Reset

у GNU'шного scanf можно юзать еще %as вроде, тогда в ф-цию передается указатель, а после выполнения указатель указывает на выделенную память со строкой. Но это не портабельно.

chicane
()

--- new.c.old   2007-11-25 23:39:33.787272483 +0200
+++ new.c       2007-11-25 23:38:26.763453014 +0200
@@ -1,6 +1,9 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
 int main(int argc, char *argv[]) {
        /*** Main function ***/
-       char filename[15];
+       char * filename;
 
        // check argumeents count.
        if (argc>2){
@@ -9,14 +12,17 @@
                }
 
        if (argc==2) {
-               filename=argv[1]; // Как его туда засунуть??????
+               filename = strdup(argv[1]);
                }
        else {
                printf("\nBitte geben Sie den Dateinamen ein, von dem man abgelesen wird:\n"); 
-               scanf("%s",&filename);
+               filename = malloc(15);
+               scanf("%14s",filename);
                printf("\n");
                }
 
        printf ("We are using %s as datasource. \n", filename);
+       free(filename);
        return 0;
 }

anonymous
()
Ответ на: комментарий от generatorglukoff

> man strdup

"О сколько нам открытий чудных..." (C)

Скажу честно: не знал :-). Хотя имя такое слышал. Впрочем, если учесть, что профессионально под C в последний раз программировал лет 7 назад...

eugine_kosenko ★★★
()

>> von dem man abgelesen wird

что бы это значило.... Ахтунг?

irq
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.