2013-02-09 4 views
4

У меня есть символ arraym char Вход [200];typcasting массив символов в const char *

ввод теперь имеет строку «abc.txt».

У меня есть метод, который строго нуждается в const char *, как я могу преобразовать свой входной массив в const char *.

Я пробовал использовать его и передавать его, но, используя GDB, я чувствую, что, поскольку остальные 192 слота на входе заполнены мусором (или пустыми), его не принимает функция. Когда я передаю строковый литерал «a.txt» к функции, она работает. поэтому в этот момент я хотел бы извлечь заполненные элементы из входного массива и преобразовать его в const char *.

Я принимаю входные данные как имя файла от пользователя, поэтому я использовал массив символов для хранения ввода.

int main() 
    { 
    char *name; 

    char input[1024]; 
    strcpy(input, argv[1]); 

    name = input; 

    sys_open(input, "O_RDWR", 00700); 


    } 
+0

Как я уже сказал в комментарии к моему ответу, второй аргумент 'open' (или в этом случае' sys_open' (который вы не должны называть напрямую)) ** не ** строка. –

+0

const char * filename, int flags, int mode. Это 3 параметра – user1888502

+0

Да, так почему вы передаете второй аргумент как строку? –

ответ

9

Вы должны иметь возможность передать его напрямую. Символ char [] может быть передан в const char *, но не наоборот.

Причина, по которой вы видите весь мусор в gdb, состоит в том, что массивы не инициализированы, чтобы содержать что-либо, поэтому вы просто видите, что там был мусор. До тех пор, пока ваша строка имеет нулевой конец, это должно быть хорошо.

+0

Если у меня есть строка, скопированная на нее, мне нужно выделить память для символа перед ее литьем, потому что она не работает для меня, несмотря на то, что у меня есть текст в char. Я чувствую, что выделенное им пространство составляет 200, но иногда пользователь может передать всего 5 символов, а остальные 194 пустые, поэтому функция не разглашает его правильно – user1888502

2

Массивы естественно разлагаются на указатели, так что это не проблема.

Проблема с «мусором» заключается в том, что это то, что находится в памяти, где находится массив. Важно следить за тем, что строка заканчивается символом '\0'.

Так строка "abc.txt" выглядит следующим образом

'a', 'b', 'c', '.', 't', 'x', 't', '\0' 

Что приходит после того, как это не имеет значения, так как все строковые функции останавливаются на '\0'.

Если вы используете массив, содержащий строку, важно использовать strlen, чтобы получить длину, а не sizeof, так как оператор sizeof дает длину всего массива, а не содержали строку.

+0

, если у меня есть массив из 200, и с помощью вызова системы записи , пользователь передает abc.txt, могу ли я передать это значение sys_open в качестве параметра const char *. Это то, что я делаю и не работаю. моя логика является правильной причиной в той же функции, когда я передаю «abc.txt» как литерал, он работает. – user1888502

+1

@ user1888502 Возможно, вам следует показать _how_, вы используете этот массив? Вероятно, вы используете 'sizeof', чтобы указать длину' write', когда вы должны использовать 'strlen'. –

+0

Я просто передаю его как открытый (ввод, «O_RDWR», 00700); , где input - char [200], у которого есть abc.txt, хранящийся в нем от пользователя, printf с% s проверяет его для меня. Но это не работает. – user1888502

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