1

私はここの初心者です、そして私があなたたちからいくつかのレッスンを受けたいといういくつかの質問があります。例えば:

#include <stdio.h>
#include<stdlib.h>
#include<ctype.h>

void main()
{
    char name[51],selection;

    do
    {

    printf("Enter name: ");
    fflush(stdin);
    fgets(name,51,stdin);
    printf("Enter another name?(Y/N)");
    scanf("%c",&selection);
    selection=toupper(selection);
    }while (selection=='Y');
                     //I want to printout the entered name here but dunno the coding
printf("END\n");
system("pause");
}

ループが実行されると変数が上書きされることを知っているので、ユーザーが入力したすべての名前を出力するコーディングを実行するにはどうすればよいですか?私はすでに私の家庭教師に頼んでいて、彼は私にポインターを使うように頼んでいます、この場合誰かが私を導くことができますか?

4

3 に答える 3

1

基本的に 2 つのオプションがあります。すべての名前のリストを作成し、最後にそれぞれをループするか、すべての名前を読み取り時に文字列に連結し、最後にそのバッファー全体を出力します。最初はおおよそ次のようになります。

 char ch[2]="Y", names[100][52]; //store up to 100 50-char names (leaving space for \n and \0)
 int x, nnames=0;
 while(nnames<100 && *ch=='Y'){
     fgets(names[nnames++], sizeof names[0], stdin); //since names is a 2d array, look
     //only at the length of a row, (in this case, names[0])
     fgets(ch, 2, stdin);
     *ch = toupper(*ch);
 }
 for(x=0; x<nnames; x++)
     //print names[x].

そして、2番目はおおよそ次のようになります。

 char names[100*52], *np=names, *ep=names+sizeof names; //an array, the position, and the end
 char ch[2]="Y";
 while(np<ep && *ch=='Y'){
      fgets(np, ep-np, stdin); //read a name, and a newline into the buffer
      //note how I use the difference between the end and the position to tell
      //fgets the most it can possibly read
      np+=strlen(np); //advance the position to the end of what we read.
      //same deal with the y/n stuff...
 }
 printf("%s", names);

文字列全体が名前に格納されているため、最後にループがないことに注意してください。

于 2012-07-07T05:31:31.463 に答える
0

リンクされたリストを使用して、入力したすべての名前を保存できます。すべてのデータ構造の本は、リンクされたリストについて多くのことを語っています。

#include <stdio.h>
#include <stdlib.h>

struct name_node
{
    char name[100];
    struct name_node *next;
};

struct name_node* add_name(struct name_node *first, const char *name)
{
    struct name_node *p;

    /* create our node */
    p = (struct name_node*)malloc(sizeof(struct name_node));
    strcpy(p->name, name);
    p->next = NULL;

    /* link our node to the tail */
    if (first) {
        for (; first->next; first = first->next);
        first->next = p;
    }

    return p;
}

void print_names(struct name_node *first)
{
    /* print names stored in the list */
    for (; first; first = first->next) {
        printf("%s\n", first->name);
    }
}

/* free the memory we used */
void destroy_list(struct name_node *first)
{
    if (first) {
        if (first->next)
            destroy_list(first->next);

        free(first);
    }
}

int main(void)
{
    struct name_node *head = NULL;
    struct name_node *node;
    char name[100];
    char selection;

    do {
        printf("Enter name: ");
        fflush(stdin);
        fgets(name, 51, stdin);

        /* save the user input to a linked list */
        /* save head if we don't have head */
        node = add_name(head, name);
        if (!head)
            head = node;

        printf("Enter another name?(Y/N)");
        scanf("%c", &selection);
        selection = toupper(selection);
    }
    while (selection == 'Y');

    /* print the list if we have any data */
    if (head)
        print_names(head);

    /* free the memory we used */
    destroy_list(head);

    printf("END\n");
    system("pause");

    return 0;
}
于 2012-07-07T03:07:03.280 に答える
0

すべての名前を取得するには、単一の文字列を使用します。

char allnames[1000] = "";

do {
    //get name in fgets
    selection = toupper(selection);
    strcat(allnames, selection);

    //Check for repetion

} while (/*there is repetion*/);

printf("%s", allnames);

すべての名前を保存するには、allnames のサイズを適切に選択する必要があります。

于 2012-07-07T04:40:17.150 に答える