2015-04-27 2 views
0

Несмотря на мои усилия по решению моей проблемы, всякий раз, когда я скомпилирую свой код, он либо имеет ошибки, либо не работает немедленно. Моя цель - создать массив символов в моей функции 'run_program', а затем передать этот массив (как указатель, чтобы я мог немедленно вернуть изменения) в мою функцию my_str_n_cat. К сожалению, сосать при кодировании, поэтому я не могу его распечатать. Любая помощь будет принята с благодарностью.Передача указателя и печати массива

//Task #1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
char my_str_n_cat (char *source_ptr) 
{ 
    (*source_ptr); 
    printf("My Name Is %s", *source_ptr); 

} 

//Main ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
int run_program() 
{ 
    int ; 
    char source[6] = {'D', 'I', 'L', 'L', 'O', 'N'}, destination[10]; 
    char *source_ptr, *destination_ptr; 

    source_ptr = source; 

    my_str_n_cat(&source_ptr); 
} 

ответ

2

Есть более чем одна проблема,

  1. Это определение,

    char source[6] = {'D', 'I', 'L', 'L', 'O', 'N'} 
    

    не могут быть распечатаны с printf(), как вы пытались.

    Функция printf() с спецификатором "%s" ожидает указатель на строку в качестве параметра, твой не является строкой строго говоря.

    Для того, чтобы быть строкой, она должна завершающего nul байт, '\0', так что это было бы правильно

    char source[7] = {'D', 'I', 'L', 'L', 'O', 'N', '\0'} 
    
  2. Вы разыменования указателя, когда вы передаете его printf(), вы не должны удалить до source_ptr.

  3. Вы передаете адрес массива, и вам не нужно, потому что имя массива эквивалентно указатель на первый элемент массива, так что

    my_str_n_cat(source_ptr); 
    

    будет достаточно ,

    Основное отличие здесь - это тип указателя, который дает информацию о компиляторе, когда вы выполняете арифметику указателя, или когда вы разыскиваете указатель через оператор индекса, который по существу тот же.

    В этом случае ничего особенного не произойдет, потому что poitner преобразуется в правильный тип указателя.

    Это одна из вещей, указывающая на то, что вы не включили предупреждения компилятора.

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

+1

И пока вы на нем, инструкция '(* source_ptr);' ничего не делает. Это эквивалентно '69;'. –

+0

Спасибо за ответ, к сожалению, у моей 'my_str_n_cat (& source_ptr)' есть ошибка, говорящая: «никакой экземпляр перегруженной функции« my_str_n_cat »не соответствует типам аргументов list: (char **)« Любая идея о том, как исправить это? Когда я удаляю ambersand, он просто печатает строку ass null. –

+0

@DillonJ. вы используете компилятор ** C++ **, и это из-за третьей точки в моем ответе, вы передаете указатель несовместимого типа. Если вы работаете с c, вам нужно настроить среду, чтобы использовать правильный компилятор. –

0

Я думаю, что вам нужно лучше понять указатель here простой.

char my_str_n_cat (char *source_ptr) 
{ 
    printf("My Name Is %s\n", source_ptr); 

} 

//Main ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
int run_program() 
{ 
    char source[6] = {'D', 'I', 'L', 'L', 'O', 'N'}, destination[10]; 
    char *source_ptr, *destination_ptr; 

    source_ptr = source; 

    my_str_n_cat(source_ptr); 
} 
+0

Почему голос? – issathink

+0

Вы вообще ничего не объясняли. –

+0

@issathink Я думаю, что что-то не так с моей окружающей средой в соответствии с iharob, так как это печатает «Меня зовут » спасибо за вашу помощь –

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