0

我已经为这段代码苦苦挣扎了很长一段时间了。这是我第一次在这里发帖。我是 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);
}

我没有使用printfand scanf,然后将名称组件存储为从 name.h 导入的名称“结构”,最后用于int strlen(char *s);计算它。

我得到这个输出带有奇怪的缩进和一切:

输入您的名字:乔

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

Hello J 字符串返回以下长度:[-my user id]$

谢谢!

4

2 回答 2

0

关于这件事的几件事并不完全正确。

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

#include <string.h>

其次,您将输入存储在 type 的变量中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直到在结果末尾获得换行符,然后决定是动态调整数据结构的大小还是抛出错误。或者,您可以使用scanfwith%1023s但您需要限定格式以指定最大长度。语法有点奇怪和棘手。fgets读取字符串时更简单。

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

最后,在您的 lastprintf中,您必须传递一种格式,然后传递该格式的所有参数。你想要更多类似的东西:

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

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

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

于 2013-03-18T03:02:11.710 回答
-1

利用

strlen(first)

首先获得变量的长度..对于其他变量类似...获得累积长度使用

printf("\n Length: ",strlen(first)+strlen(middle)+strlen(last));
于 2013-03-18T02:47:57.497 回答