繁体   English   中英

读取字符串的最佳方法是什么?

[英]What is the best way to read a string?

所以我真的很困惑。 我必须用C编写一个程序,这基本上是一个地址簿,因此我必须从用户那里获取多个字符串(名称,ID,电话等)。

在开始时,我仅尝试使用scanf()但有时将其与换行符'\\n'混为一谈。 经过一番谷歌搜索后,我最终使用scanf()获取单个字符或整数(用户回答是或否的问题,或者从菜单中选择一个动作)和fgets()来读取通讯簿的字段。 但是,在使用scanf()之后,我还不得不多次使用fflush(stdin) scanf() ,这在我看来是不推荐的。 该方法已达到预期的效果。

那么从用户读取字符串的最佳方法是什么? fflush(stdin)不提供可移植性吗? 这是一项任务,因此我也必须考虑可移植性,因为我将在另一台计算机上执行代码。

先感谢您。

编辑:所以这是到目前为止我得到的。 请原谅用另一种语言(阿尔巴尼亚语)写的单词。 我相信您可以了解发生了什么。

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

void regjistrim();
void kerkim();
void modifikim();
void fshirje();
void rradhitje();
void display();

#define EMRI 50
#define MBIEMRI 50
#define ID 20
#define TEL 20
#define EMAIL 25

typedef struct addressbook
{
    char emri[EMRI];
    char mbiemri[MBIEMRI];
    char id[ID];
    char tel[TEL];
    char email[EMAIL];
} addressbook;

FILE* Addressbook;

int main(void)
{
    char input[2];
    int choice;

    printf("----------------ADDRESS BOOK----------------");
    printf("\n\n\t1 - Regjistrimi i ri\n");
    printf("\n\t2 - Kerkim\n");
    printf("\n\t3 - Modifikim\n");
    printf("\n\t4 - Fshirje\n");
    printf("\n\t5 - Rradhitje\n");
    printf("\n\t6 - Afishim i address book\n");
    printf("\n\t0 - Exit\n");

    fgets(input, 2, stdin);
    sscanf(input, "%d", &choice);

    while (choice < 0 || choice > 6)
    {
        printf("\nShtypni nje numer nga 0 - 6: \n");
        fgets(input, 2, stdin);
        sscanf(input, "%d", &choice);
    }

    switch (choice)
    {
        case 1:
            regjistrim();
            break;
        case 2:
            kerkim();
            break;
        case 3:
            modifikim();
            break;
        case 4:
            fshirje();
            break;
        case 5:
            rradhitje();
            break;
        case 6:
            display();
            break;
        case 0:
            exit(0);
            break;
    }

    return 0;
}


//Regjistron nje qytetar ne addressbook
void regjistrim()
{
    char answer;

    addressbook entry;
    do
    {
        Addressbook = fopen("Addressbook.txt", "a+");

        printf("\nShtypni emrin: ");
        fgets(entry.emri, EMRI, stdin);

        printf("\nShtypni mbiemrin: ");
        fgets(entry.mbiemri, MBIEMRI, stdin);

        printf("\nShtypni ID-in: ");
        fgets(entry.id, ID, stdin);

        printf("\nShtypni nr. telefoni: ");
        fgets(entry.tel, TEL, stdin);

        printf("\nShtypni email-in: ");
        fgets(entry.email, EMAIL, stdin);

        fprintf(Addressbook, "Emri: %sMbiemri: %sID: %sNr. telefoni: %sEmail: %s\n", entry.emri, entry.mbiemri, entry.id, entry.tel,entry.email);

        fclose(Addressbook);

        printf("\nShtypni y/Y neqoftese doni te regjistroni person tjeter: ");
        fgets(answer, 1, stdin);
    }
    while(answer == 'y' || answer == 'Y');
}

使用scanf ,您可以像这样清除换行符。 另外,我也包括了fgets

#include<stdio.h>

int main(void)
{
    int i, N = 5;
    char buffer[N];

    printf("Enter %d characters\n", N+1);

    scanf("%5s", buffer);   /* MUST check comments below on this page for this! */

    /* Clear trailing input */
    while(getchar() != '\n')
        /* discard */ ;


    for(i = 0 ; i < 5 ; ++i)
        printf("|%c|\n", buffer[i]);

    printf("End with scanf\n\n");

    /*****************************************************/

    printf("Enter %d characters\n", N+1);

    fgets(buffer, 5, stdin);

    for(i = 0 ; i < 5 ; ++i)
        printf("|%c|\n", buffer[i]);

    printf("End with fgets\n\n");

    return 0;
}

另外,此代码演示了可以限制输入的每个函数的数量。

资源

好吧,“最佳”可能有点主观,但是我发现做一个单独的函数来读取数字会使事情变得容易一些,并且如果您不是绝对需要它,则避免使用scanf

int readNumber(int min, int max)
{
  char number[32];
  do
  {
    if ( fgets( number, sizeof(number), stdin ) != NULL )
    {
      // note that if 'number' is not a number atoi returns 0
      int n = atoi(number); 

      if ( n>= min && n <= max ) 
      { 
        return n;
      }
    }
    printf( "please enter a valid value between %d and %d\n", min, max );
  }
  while ( 1 );

  return -1; // never reached
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM