Правильно ли вы имеете в виду отсутствие ошибок?ну, это зависит от ситуации.Но есть несколько практических правил, которые я могу порекомендовать.
Во-первых, обратите внимание, что строки в C не похожи на строки в других языках.
Они являются указателями на блок символов.Конец которого заканчивается 0-байтовым или нулевым терминатором.следовательно, строка с нулевым символом в конце.
Так, например, если вы собираетесь сделать что-то вроде этого:
char* str;
gets(str);
или каким-либо образом взаимодействовать с str, это монументальная ошибка.Причина в том, что, как я только что сказал, в C строки не являются строками, как в других языках.Они просто указатели.char * str - это размер указателя, который всегда будет.
Следовательно, вам нужно выделить немного памяти для хранения строки.
/* this allocates 100 characters for a string
(including the null), remember to free it with free() */
char* str = (char*)malloc(100);
str[0] = 0;
/* so does this, automatically freed when it goes out of scope */
char str[100] = "";
Однако иногда все, что вам нужно, это указатель.
Например,
/* This declares the string (not intialized) */
char* str;
/* use the string from earlier and assign the allocated/copied
buffer to our variable */
str = strdup(other_string);
В общем, это действительно зависит от того, как вы ожидаете использовать строковый указатель.Я рекомендую либо использовать форму массива фиксированного размера, если вы собираетесь использовать ее только в области действия этой функции, а строка является относительно небольшой.Или инициализируйте его в NULL.Затем вы можете явно проверить NULL-строку, что полезно при ее передаче в функцию.
Остерегайтесь того, что использование формы массива также может быть проблемой, если вы используете функцию, которая просто проверяет NULL на предмет того, где конецстрокинапример, функции strcpy или strcat не заботятся о том, насколько велик ваш буфер.Поэтому рассмотрите возможность использования альтернативы, такой как BSD's strlcpy & strlcat.Или strcpy_s & strcat_s (windows).
Многие функции ожидают, что вы также передадите правильный адрес.Итак, еще раз, имейте в виду, что
char* str = NULL;
strcmp(str, "Hello World");
будет аварийно завершаться, потому что strcmp не нравится, когда передается NULL.
Вы пометили это как C, но если кто-то использует C ++ ичитает этот вопрос, затем переключается на использование std :: string, где это возможно, и использует функцию-член .c_str () для строки, где вам нужно взаимодействовать с API, который требует стандартной строки c с нулевым символом в конце.