请求一个名称并返回名称的长度(C)

请求一个名称并返回名称的长度(C),c,counting,C,Counting,我已经为这段代码挣扎了很长时间了。 这是我第一次在这里发帖。我是C语言的新手,我觉得我几乎就要学会了 我得问一下你的名字,中间的首字母和姓氏。然后我问候你,告诉你名字的长度。听起来很简单。我有以下代码,我必须使用头文件,因为它在这里,这使事情变得更糟。任何帮助都将不胜感激,我觉得我已经把我所有的知识都用到了它上,但仍然无法让它发挥作用 这是我的头文件: #ifndef NAME_H_ #define NAME_H_ struct name{ char first[20]; char

我已经为这段代码挣扎了很长时间了。 这是我第一次在这里发帖。我是C语言的新手,我觉得我几乎就要学会了

我得问一下你的名字,中间的首字母和姓氏。然后我问候你,告诉你名字的长度。听起来很简单。我有以下代码,我必须使用头文件,因为它在这里,这使事情变得更糟。任何帮助都将不胜感激,我觉得我已经把我所有的知识都用到了它上,但仍然无法让它发挥作用

这是我的头文件:

#ifndef NAME_H_
#define NAME_H_

struct name{
   char first[20];
   char middle;
   char last[20];
};

#endif
这是我的.c文件:

#include "name.h"
#include <stdio.h>
#define nl printf("\n");

int strlen(char*s);

char first;
char middle;
char last;

main()
{
    printf("enter your first name : ");
    scanf("%c", &first);
    printf("\n enter your middle initial name : ");
    scanf("%c", &middle);
    printf("\n enter your last name: ");
    scanf("%c", &last);

    printf("\n\n Hello %c",first, " %c" ,middle, " %c", last);
    printf("\n The String returned the following length: ",strlen);
}
#包括“name.h”
#包括
#定义nl printf(“\n”);
int strlen(字符*s);
焦优先;
炭中部;
炭末;
main()
{
printf(“输入您的名字:”);
scanf(“%c”,第一个(&F);
printf(“\n输入中间的首字母:”);
scanf(“%c”和中间);
printf(“\n输入您的姓氏:”);
scanf(“%c”和最后一个);
printf(“\n\n您好%c”,第一个,“%c”,中间,“%c”,最后一个);
printf(“\n字符串返回以下长度:”,strlen);
}
我没有使用
printf
scanf
,然后将名称组件存储为从name.h导入的名称“结构”,最后使用
int strlen(char*s)来计算它

我用奇怪的缩进和所有东西得到这个输出:

输入你的名字:乔

输入您的中间首字母名称: 输入您的姓氏:

你好,J 该字符串返回以下长度:[-my user id]$

谢谢

使用

strlen(first)
首先获取变量的长度..类似地,对于其他变量。。。要获取累积长度,请使用

printf("\n Length: ",strlen(first)+strlen(middle)+strlen(last));

关于这一点,有几点是不太正确的

首先,你不应该自己声明strlen。这是一个标准的C库函数,这意味着您应该包含适当的头。在这种情况下,

#include <string.h>
至少会让你开始。您的
struct name
有一些这样的功能,但您当前没有使用它(而且大小非常小)

接下来,
scanf
是一种获取输入字符串的复杂方法<一个
%s
模式的code>scanf
将愉快地读取超过1024个字符,并写入缓冲区的末尾,并销毁您的程序。这就是为什么C程序员通常使用
fgets
读取输入数据的原因,因为这样您就可以更容易地说出您愿意读取的缓冲区有多大:

fgets(first, sizeof(first), stdin);
请注意,如果用户输入的字符超过1023个,它将读取前1023个字符,然后将其余字符保留在那里,您将最终将其作为中间名称的一部分进行读取。C中的字符串处理非常复杂!C不擅长这类事情;这就是为什么人们倾向于使用Perl或类似的语言进行这种交互式字符串处理,而您事先不知道大小。在C语言中,您必须执行一种策略,比如反复调用
fgets
,直到结果末尾有一个换行符,然后决定是动态调整数据结构大小还是抛出错误。或者,您可以将
scanf
%1023s
一起使用,但需要限定格式以指定最大长度。语法有点奇怪和棘手
fgets
在读取字符串时更简单

正如在另一个答案中提到的,
strlen
是一个函数,您需要调用
char*
变量(或
char
数组)来获取它所包含字符串的长度。您可能想在
第一个
中间
,和
最后一个
上调用它,并将它们添加到一起

最后,在最后一个
printf
中,必须传递一种格式,然后传递该格式的所有参数。你想要的东西更像:

printf("\n\n Hello %s %s %s", first, middle, last);
(一旦确定了这些变量的类型)


这是很多随机的细节。我希望它能帮助一些人。重要的简要说明是,C中的字符串是以值为0的
char
结尾的
char
序列,所有C数据结构都必须预先调整大小(使用
malloc
静态或动态调整)。此外,C没有边界检查,因此完全由您来确保只读取为其创建空间所需的数据。

您的.C文件的第一个字符是。(点),请删除该字符,然后再次运行。这是因为您的名称变量当前声明为单个字符而不是字符串。谢谢,现在看起来更健康了。好的是它仍然在运行。坏消息是它仍然运行错误,但以更健康的方式运行。
printf("\n\n Hello %s %s %s", first, middle, last);