2016-11-18 5 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()から文字列を送信して文字数を数えるために文字列を送信しようとしています。私が文字列を渡すたびに、その文字列はぎこちなく出てきます。間違っていますか?私は最初と最後の名前を取得し、フルネームを連結するために1つの関数を使用し、文字の数を数えるために別の関数を使用する必要があります。関数からメインに文字列を渡す

+2

なぜポインタの配列で読み取る文字列に代わりsscanfを使用する情報を抽出する必要がある場合は、キーボードからの読み取りscanfを使用するfgets()

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

は、避けなければならないのですか? '' char * fullname [80]; '' char fullname [160]; '、79 + 79 + 1 space +末尾のNUL –

+0

[関数パラメータ](http://stackoverflow.com/documentation/c/1006)/function-parameters#t = 201611180623366898669) – Danh

+0

'get_name'はmainの中の' fullname'変数を変更していないので、 'display_name'には初期化されていないchar配列が渡されます。 – acraig5075

答えて

2

あなたはポインタとscanfをかなり間違って使用しています。

最初にscanfの引数toは%sのためのtoは文字の配列であると考えられます。配列は実際に配列へのポインタであることに注意してください。

第2に、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でfirst、second、およびfullnameを宣言すると、それらはそのファンクションに対してローカルです。関数の外に値を渡すには、最悪の方法から始めて2つの方法があります。

(1)変数globalを宣言します。 s)。

(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

+0

グローバル変数は使用できません。 – HopelessDumplings

+0

@HopelessDumplings良い! –

関連する問題