Добавить строку в массив символов в C - PullRequest
1 голос
/ 24 августа 2010

У меня есть массив C с именем buf. Вот его определение:

char buf[1024];

Теперь мой текущий код взят из stdin и использует fgets() для установки этого массива, однако я хочу использовать код для его установки. Прямо сейчас строка, которая устанавливает buf, выглядит так:

fgets(buf, 1024, stdin);

По сути, я хочу заменить стандартный ввод на ... "Моя строка". Какой лучший способ сделать это?

Ответы [ 5 ]

8 голосов
/ 24 августа 2010

Найдите sprintf, например, здесь: Cpp reference

Edit:

sprintf(buf, "My string with args %d", (long) my_double_variable);

Редактировать 2:

Как предлагается, чтобы избежать переполнения (но это стандарт C), вы можете использовать snprintf .

4 голосов
/ 24 августа 2010

snprintf - это только C99, а не C89, sprintf_s / strcpy_s - это только MSVC, а не C89, не C99.

char *mystr="come from stdin or file or ...";
char buf[1024];
...
memset(buf,0,sizeof buf);
strncpy(buf,mystr,(sizeof buf)-1);

или не массив:

#define BUFLEN 512
char *mystr="come from stdin or file or ...";
char *buf;
...
char *buf=calloc(1,BUFLEN);
strncpy(buf,mystr,BUFLEN-1);

Работает во всех средах ANSI C.

2 голосов
/ 24 августа 2010
strcpy(buf, "My String");

Компилятор Microsoft также включает функцию strcpy_s, которая является «безопасной» версией strcpy.Это гарантирует, что вы не наберете 1002 *.В данном конкретном случае это, вероятно, не проблема, но вы должны знать об этом.Но имейте в виду, что он недоступен с любым другим компилятором, поэтому его нельзя использовать там, где требуется перенос.

 strcpy_s(buf, sizeof(buf), "My String");
1 голос
/ 24 августа 2010

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

...

char input[] = "My String";

strcpy(buf, input);

strncpy(buf, input, sizeof(buf));

sscanf(input, "%s", buf);

sprintf(buf, "%s", input);

memcpy(buf, input, strlen(input));

...

большинство из них не уверены / не уверены. Что именно следует принять, зависит на что вы действительно хотите сделать в вашем коде.

Привет

БВУ

0 голосов
/ 24 августа 2010

Подробно, но безопасно:

int copy_size = sizeof( buf ) - 1 < strlen( MyString ) ? sizeof( buf ) - 1 : strlen( MyString );
memset( buf, 0, copy_size + 1 );
memcpy( buf, MyString, copy_size );
...