c - 正确缓冲和验证字符串

标签 c

我的程序出现了一点错误,它有点基础,但这是我的错误:我正在尝试将一系列字符串正确输入到结构中,但用户输入似乎在错误的位置结束.

#include <stdio.h>
#include <string.h>

#define buffer 256
struct Fisher
 {
 char  SSN[8]; //9 digit max
 char First_Name[12];
 char Last_Name[15];
 char Phone[10];
 char Email[35];
 }typedef Fisher;

void getFisher(Fisher* pfisher, int i);
void dispFisher(Fisher* pfisher, int i);
void Fisherman_Menu(Fisher* pfisher, int i);
int main()
{
int i = 0;
   Fisher fisherarray[3];
   Fisher* pfisher = &fisherarray[0];
   Fisherman_Menu(pfisher, i);
   return 0;
}
void Fisherman_Menu(Fisher* pfisher, int i)
{

    for(;;)
    {
fflush(stdin);
        printf("-1-Register Fisherman\n");
        printf("-2-Search Fisherman\n");
        printf("-3-Go back to Main Menu\n");
fflush(stdin);
        int choice=0;
        scanf(" %d", &choice);
        if (choice == 1)
        {
         fflush(stdin);
            getFisher(pfisher, i);
            i++;
        }
        if (choice == 2)
            {
                fflush(stdin);
                dispFisher(pfisher, i);
            }
        else if (choice == 3)
        {
            break;  /* Break out of loop */
        }
        else
            printf("Anything else?\n");
    }

    /* When this function returns, you get back to the main menu */
}
void getFisher(Fisher* pfisher, int i)
{
    char input[buffer];
    char* pinput = NULL;
    //===============================
    printf("Enter Social Security Number: ");
    pinput = fgets(input, buffer, stdin);//validate
    strcpy((pfisher+i)->SSN, pinput);
    //(pfisher+i)->SSN = atoi(pinput);

    //==============================
    printf("Enter first name: ");
    pinput = fgets(input, buffer, stdin);//validates name
    strcpy((pfisher+i)->First_Name, pinput);

    //==============================
    printf("Enter last name: ");
    pinput = fgets(input, buffer, stdin);//validates name
            strcpy((pfisher+i)->Last_Name, pinput);

    //==============================
    printf("Enter phone number as a 10 digit number (without any    
        dashes     or spaces): ");
    pinput = fgets(input, buffer, stdin);//validate phone
        strcpy((pfisher+i)->Phone, pinput);
        //(pfisher+i)->Phone = atoi(pinput);

        //===============================
        printf("Enter email address: ");
        pinput = fgets(input, 20, stdin);//validates name
        strcpy((pfisher+i)->Email, pinput);
    }
    void dispFisher(Fisher* pfisher, int i)
    {
    int len;
    int pen;
     printf("ssn is equal to: %s\n", ((pfisher+0)->SSN));
     printf("First Name is equal to: %s\n", ((pfisher+0)->First_Name));
     printf("ssn is equal to: %s\n", ((pfisher+1)->SSN));
      printf("First Name is equal to: %s\n", ((pfisher+1)->First_Name));

    len = strlen(((pfisher+0)->SSN));
    printf("string length = %d\n", len);
    pen = strlen(((pfisher+1)->SSN));
    printf("string length = %d\n", len);
    /*
        int arr = 0;
        char searchSSN[9];
        printf("Enter SSN: ");
              scanf("%s", &searchSSN);

              for(arr = 0; arr < i; arr++)
                {
                    if(strcmp(&searchSSN, (pfisher+arr)->SSN) == 0)

                {

        //printf("I is equal to: %s\n", (pfisher+i)->SSN);
        printf("Fisher\n");
        printf("-------------------------------------------\n");
        printf("%d \n %s \n %s \n %s \n %s ", (pfisher + arr)->SSN, ((pfisher+arr)->First_Name), ((pfisher+arr)->Last_Name), ((pfisher+arr)->Phone), (pfisher+arr)->Email);
        printf("-------------------------------------------\n");

    }


      }

    */
    }

我的 SSN 输出变得一团糟,变成了“123456789(名字字符串)
示例:123456789TurboTurkey 如何清理字符串的长度并正确进入SSN

最佳答案

SSN 中没有足够的空间来存储 9 位数字。如果要在其中存储 9 位数字,则其大小应为 10(9 位数字 + NULL)。如果没有 NULL 字符,它也会读取 near by locations..

关于c - 正确缓冲和验证字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36659470/

相关文章:

检查二叉树中的子代求和属性

c - 需要你的帮助来找到我的回文

c - C 语言的 MPI 程序崩溃

c - 未定义的行为?

python - 在 C 或 Python 中使用 popen 绕过子进程输出的缓冲

c - array 和 &array 有什么区别?

c - 结构体和链表

c - 动态分配的结构数组中的段错误,C

c++ - 在 C/C++ 中,是否保证 volatile 变量在线程之间具有最终一致的语义?

c - 最好将指向结构的指针传递给 C 中的函数