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

とを使用printfしてscanf、name.hからインポートした名前「構造」を名前コンポーネントに格納し、最後int strlen(char *s);にそれを計算するために使用します。

私は奇妙なインデントとすべてでこの出力を取得します:

あなたの名を入力してください:ジョー

ミドルネームのイニシャル名を入力してください:名前を入力してください:

こんにちはJ文字列は次の長さを返しました:[-my user id] $

ありがとう!

4

2 に答える 2

0

これに関するいくつかのことは完全に正しくありません。

まず、自分自身を宣言するべきではありませんstrlen。これは標準Cライブラリ関数です。つまり、適切なヘッダーを含める必要があります。この場合、

#include <string.h>

次に、入力をタイプの変数に格納しますchar。それらは文字通り彼らが言うことです:彼らは単一の文字を保存します。したがって、ユーザーに1文字の名前のみを許可する場合を除いて、それよりも少し多くの名前が必要になります。この種の文字列入力の問題は、Cでは実際にはかなり注意が必要です。これは、明示的なメモリ管理を行う必要があり、ユーザーが事前に送信するデータの量がわからないためです。より簡単なことの1つは、大きなバッファーを使用して切り捨てることですが、より複雑なプログラムの場合は、エラー処理を実行し、場合によってはバッファーのサイズを動的に変更する必要があります。しかし、初心者のために:

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

少なくともあなたが始められるでしょう。あなたstruct nameはこれのいくつかを持っていますが、あなたは現在それを使用していません(そしてサイズはかなり小さいです)。

次に、scanf入力文字列を取得するためのトリッキーな方法です。 scanfパターンの1%sつは、1024文字を超えて読み取り、バッファの終わりを上書きしてプログラムを破棄します。これが、Cプログラマーが通常、代わりにを使用して入力データを読み取る理由fgetsです。それ以降、読み取るバッファーの大きさをより簡単に言うことができます。

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

ユーザーが1023文字を超える文字を入力すると、最初の1023文字が読み取られ、残りはそこに残され、ミドルネームの一部として読み取られることに注意してください。Cでの文字列処理は複雑です!Cはこの種のことは得意ではありません。そのため、事前にサイズがわからないこの種のインタラクティブな文字列処理には、Perlまたは同様の言語を使用する傾向があります。fgetsCでは、結果の最後に改行が入るまで繰り返し呼び出してから、データ構造のサイズを動的に変更するか、エラーをスローするかを決定するなどの戦略を実行する必要があります。または、で使用することもできますがscanf%1023s最大長を指定するにはフォーマットを修飾する必要があります。構文は少し奇妙でトリッキーです。fgets文字列を読んでいるときはもっと簡単です。

他の回答で述べたように、は、保持する文字列の長さを取得するために変数(または配列)strlenを呼び出す必要がある関数です。、、で呼び出して、それらを一緒に追加することをお勧めします。char *charfirstmiddlelast

最後に、最後に、printf1つの形式を渡してから、その形式のすべての引数を渡す必要があります。あなたはもっと次のようなものが欲しいです:

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

(これらの変数のタイプを修正したら)。

これは多くのランダムな詳細です。私はそれがいくつかの助けになることを願っています。重要な簡単なポイントは、Cの文字列は、値0でchar終わるシーケンスでcharあり、すべての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 に答える