从函数传递String到Main

时间:2016-11-18 06:16:59

标签: c

#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);
}   

我试图从get_name()发送字符串以显示名称以计算字符数。每当我通过弦乐时,它就会变成胡言乱语。我错了吗?我需要使用一个函数来获取名字和姓氏并连接全名,然后使用另一个函数来计算字符数。

2 个答案:

答案 0 :(得分:2)

您正在使用指针和scanf非常错误。

首先,scanf的{​​{1}}参数应该是一个字符数组。请记住,数组实际上是指向数组的指针。

其次,您声明%s是一个包含80个指针的数组,这可能不是您想要做的。特别是当你没有为字符串分配空间时。

相反它应该是这样的:

fullname

答案 1 :(得分:2)

变量声明在声明它们的范围内是本地的。 Iow在函数get_name中声明第一个,第二个和全名时,它们是该函数的本地名称。为了将函数传递给函数之外你有两个,没有三种方法可以从最坏的方式开始:

(1)声明变量global,即在main之外然后在你的函数中共享该变量。

(2)在main中声明变量,但将其传递给函数,然后函数填充字符串

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); 
...

修改

为了从键盘读取字符串,最好使用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来提取信息