要求输入名称并在C中返回名称的长度

时间:2013-03-18 02:45:19

标签: c counting

我一直在努力使用这段代码已有一段时间了。 这是我第一次在这里发帖。我是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);
}

我没有使用printfscanf,然后将名称组件存储为从name.h导入的名称“structure”,最后使用int strlen(char *s);进行计算。

我使用奇怪的缩进和所有内容获得此输出:

  

输入您的名字:Joe

     

输入您的中间名字:   输入您的姓氏:

     

你好J.   String返回以下长度:[ - my user id] $

谢谢!

2 个答案:

答案 0 :(得分:0)

关于这一点的一些事情并不完全正确。

首先,你不应该自己宣布strlen。它是标准的C库函数,这意味着您应该包含适当的标题。在这种情况下,

#include <string.h>

其次,您将输入存储在char类型的变量中。这些就是他们所说的:他们存储一个角色。因此,除非你只允许人们使用单字符名称,否则你需要的不止这些。这种字符串输入问题在C中实际上相当棘手,因为您必须进行显式内存管理,并且不知道用户将提前向您发送多少数据。其中一个更简单的事情是使用大缓冲区并截断,但对于更复杂的程序,您需要进行错误处理并可能动态调整缓冲区大小。但对于初学者:

char first[1024];
char middle[1024];
char last[1024];

至少可以让你开始。您的struct name有一些,但您目前没有使用它(尺寸非常小)。

接下来,scanf是获取输入字符串的棘手方法。 scanf模式的%s将很乐意读取超过1024个字符并写入缓冲区的末尾并销毁您的程序。这就是为什么C程序员通常使用fgets读取输入数据的原因,从那以后你可以更容易地说出你愿意阅读的缓冲区有多大:

fgets(first, sizeof(first), stdin);

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

正如在另一个答案中所提到的,strlen是一个函数,您需要调用char *变量(或char数组)来获取它所拥有的字符串的长度。您可能希望在firstmiddlelast上对其进行调用,然后将它们添加到一起。

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

printf("\n\n Hello %s %s %s", first, middle, last);

(一旦你修改了这些变量的类型)。

这是很多随机细节。我希望它有所帮助。重要的简要介绍是,C中的字符串是char的序列,以char结尾,值为0,所有C数据结构必须提前调整大小(静态或动态调整) malloc)。此外,C没有边界检查,因此完全取决于您确保只读取为创建空间的数据。

答案 1 :(得分:-1)

使用

strlen(first)

首先获取变量的长度..类似于其他变量...要获得累积长度,请使用

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