2016-11-18 2 views
1
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

void get_name(); 
void display_name(char *fullname); 



int main(void) 
{ 

char first[80]; 
char second[80]; 
char *fullname[80]; 



get_name(); 
display_name(*fullname); 



system("pause"); 

return 0; 

} 

void get_name() 
{ 
char first[80]; 
char second[80]; 
char *fullname[80]; 


printf("Please enter first name: "); 
scanf("%s", &first); 



printf("\nPlease enter last name: "); 
scanf("%s", &second); 



strcpy(*fullname, first); 
strcat(*fullname, " "); 
strcat(*fullname, second); 

printf("\n\nFull name is : %s ", *fullname); 

} 


void display_name(char *fullname) 
{ 

    int index; 
    char check; 
    int count=0; 
    printf("\n\nFull name is : %s ", fullname); //check to see if string is passes correctly 

    for(index=0; fullname[index] != '\0'; index++) 
    { 
     check=fullname[index]; 



     if(check != ' ') 
     { 
      count++; 
     } 


    } 

    printf("\n\nNumber of characters in string is: %i\n", count); 
} 

im пытается отправить строку из get_name(), чтобы отобразить имя для подсчета количества символов. Каждый раз, когда я передаю строку, ее выходят как тарабарщина. Я ошибаюсь? Мне нужно использовать одну функцию для получения имени и фамилии и конкатенации полного имени, а затем использовать другую функцию для подсчета количества символов.Передача строки на главную по функции

+2

Почему массив указателей? 'char * fullname [80];' -> 'char fullname [160];', 79 + 79 + 1 пробел + конечный NUL –

+0

[Function Parameter] (http://stackoverflow.com/documentation/c/1006/function-parameters # t = 201611180623366898669) – Danh

+0

'get_name' не изменяет переменную' fullname' внутри main, поэтому 'display_name' передается неинициализированный массив символов, следовательно, тарабарщина. – acraig5075

ответ

2

Вы используете указатели и scanf совершенно ошибочно.

Прежде всего scanf аргумент для %s должен быть массивом символов. Помните, что массив на самом деле является указателем на массив.

Второе, что вы объявляете fullname, чтобы быть массивом из 80 указателей, который, вероятно, не является тем, что вы хотите сделать. Особенно, когда вы не выделяете пространство для строки.

Вместо этого должно быть что-то вроде:

void get_name() 
{ 
    char first[80]; 
    char second[80]; 
    char fullname[80]; // an array of chars instead of pointers 

    printf("Please enter first name: "); 
    scanf("%s", first); // not taking the address of first - is already an address 

    printf("\nPlease enter last name: "); 
    scanf("%s", second); // not taking the address of second - is already an address 

    strcpy(fullname, first); // don't dereference fullname 
    strcat(fullname, " "); // don't dereference fullname 
    strcat(fullname, second); // don't dereference fullname 

    printf("\n\nFull name is : %s ", fullname); // don't dereference fullname 

} 
2

Заявления переменных являются локальными для сферы, где они были объявлены. IOW, когда вы объявляете первое, второе и полное имя в своей функции get_name, они являются локальными для этой функции. Чтобы передать значение вне функции, у вас есть два, нет трех способов сделать это, начиная с наихудшего способа:

(1) объявить переменную глобальную, то есть вне основного, а затем передать эту переменную в вашу функцию (с).

(2) объявить переменную в главной, но передать его функции, которые затем заполняет в строке

int main() 
{ 
    char fullname[80]; 
    get_name(fullname,sizeof(fullname)); // good to tell function avail size 
... 

void get_name(char* fullname, size_t length) 
{ 
... 

(3) Выделение памяти в куче, динамической памяти можно передавать между функциями с помощью указатель

int main() 
{ 
    char* fullname = NULL; 
    get_name(&fullname); 
... 

void get_name(char** fullname) 
{ 
    *fullname = malloc(80); 
... 

EDIT

для того, чтобы читать строки с клавиатуры, то лучше использовать fgets()

char buffer[128]; 
if (fgets(buffer,sizeof(buffer),stdin) != NULL) { 
    // remove the \n 
    char* p = strchr(buffer,'\n'); 
    if (p != NULL) { 
    *p = '\0'; 
    } 
} 

Использование scanf чтение с клавиатуры следует избегать, если вам нужно извлечь информацию использовать вместо sscanf на строку для чтения с fgets

+0

Я не могу использовать глобальные переменные. – HopelessDumplings

+0

@HopelessDumplings хорошо! –

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