#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()发送字符串以显示名称以计算字符数。每当我通过弦乐时,它就会变成胡言乱语。我错了吗?我需要使用一个函数来获取名字和姓氏并连接全名,然后使用另一个函数来计算字符数。
答案 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
来提取信息