从用户那里获取整数时使用空格

Using spaces while taking integers from the user

我正在尝试练习一些有关文本文件、打印和读取文本的内容。我需要从用户那里获取输入 - 也许是他们的 phone 号码或其他人的 - 但我 想要 他们 能够在数字之间使用空格

假设我的 phone 号码是:565 856 12 我希望他们能够给我这个带空格的数字,而不是像 56585612

这样的压缩版本

到目前为止我已经尝试过 scanf() 但我不知道如何让 scanf() 做这样的事情。我试过使用字符和循环,但很麻烦。

当我输入 565 856 12 并按 Enter 键时,phone 数字只会被计算为 565。 856 12 用于下一个 scanf.

struct Student{
   unsigned long long student_phone_number;
}


int main(){
   FILE *filePtr;
   filePtr = fopen("std_info.txt","w");

   struct Student Student1;
   printf("\nEnter Student's Phone Number: ");
      scanf("%llu",&Student1.student_phone_number);
      fprintf(filePtr,"%llu\t",Student1.student_phone_number);

}

为此目的使用字符串和 trim 字符串中的空格,然后使用 atoi 函数将给定数字转换为整数,要使用 atoi,您必须包含 stdlib.h 头文件。例如

#include<stdio.h>
#include<stdlib.h>
int main(){
        char str[] = "123456";
        unsigned long long int num = atoi(str);
        printf("%llu", num);
}

您可以使用 fgets 来解析包含空格和所有的输入:

#include <stdio.h>

#define SIZE 100

int main() {
    
    char str[SIZE];

    fgets(str, sizeof str, stdin); // parses input string with spaces
                                   // and checks destination buffer bounds
                                     
}

如果您随后想要删除空格,您可以轻松地做到这一点:

#include <ctype.h>

void remove_white_spaces(char *str)
{
    int i = 0, j = 0;
    while (str[i])
    {
        if (!isspace(str[i]))
          str[j++] = str[i];
        i++;
    }
    str[j] = '[=11=]';
    
}

Presto,此函数将从您作为参数传递的字符串中删除空格。

Live demo

输入:

12 4 345 789

输出:

124345789

之后把它转换成无符号整数很容易,可以用strtoul,但是为什么要用数值类型存储一个phone数,会不会是算术运算在上面?令人怀疑。然后你保存到一个文件中,所以它是字符串还是数字类型真的无关紧要。我会把它作为一个字符串。

为了解决这个问题,我修改了Student结构来存储unsigned long long整数和字符数组。用户从 stdin 读取字符数组。使用isValid()方法验证读取数据,使用convertToNumber()方法将字符串转换为unsigned long long整数。

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

struct Student{
    unsigned long long numberForm;  
    char *textForm;             
};

// Converts character array to unsigned long long integer.
void convertToNumber(struct Student * const student);
// Validates the data in the Student.textForm variable.
bool isValid(const char * const input, const char * const format);
// Returns the number of characters in a character array.
size_t getSize(const char * const input);
// This function returns the "base ^ exponent" result.
unsigned long long power(int base, unsigned int exponent);

int main()
{
    struct Student student;
    char format[] = "NNN NNN NN"; /* "123 456 78" */
    
    printf("Enter phone number: ");
    fgets(student.textForm, getSize(format) + 1, stdin); 
    // The gets() function is deprecated in newer versions of the C/C++ standards.
    
    if(isValid(student.textForm, format))
    {
        convertToNumber(&student);
        printf("Result: %llu", student.numberForm);
    }

    return 0;
}

void convertToNumber(struct Student * const student)
{
    int size = getSize(student->textForm) - 2;
    unsigned int temp[size];
    student->numberForm = 0ull;
    
    for(int i = 0, j = 0 ; i < getSize(student->textForm) ; ++i)
        if(isdigit(student->textForm[i]))
            temp[j++] = student->textForm[i] - '0';
    
    for(size_t i = 0 ; i < size ; ++i)
        student->numberForm += temp[i] * power(10, size - i - 1);
}

bool isValid(const char * const input, const char * const format)
{   
    if(getSize(input) == getSize(format))
    {
        size_t i;

        for(i = 0 ; i < getSize(input) ; ++i)
        {
            if(format[i] == 'N')
            {
                if(!isdigit(input[i]))
                    break;
            }
            else if(format[i] == ' ')
            {
                if(input[i] != format[i])
                    break;
            }
        }

        if(i == getSize(input))
            return true;
    }
    return false;
}

unsigned long long power(int base, unsigned int exponent)
{
    unsigned long long result = 1;
    
    for(size_t i = 0 ; i < exponent ; ++i)
        result *= base;
    
    return result;
}

size_t getSize(const char * const input)
{
    size_t size = 0;
    
    while(input[++size] != '[=10=]');
    
    return size;
}

这个程序的工作原理如下:

Enter phone number: 123 465 78
Result: 12346578

通常将电话号码存储为字符串而不是数字更好。

为了将整行输入(而不是单个单词)读取为字符串,我建议您使用函数 fgets

这是一个基于您问题中的代码的示例:

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

struct Student{
   char phone_number[50];
};

int main( void )
{
    //open output file (copied from code in OP's question)
    FILE *filePtr;
    filePtr = fopen("std_info.txt","w");

    //other variable declarations
    struct Student Student1;
    char *p;

    //prompt user for input
    printf( "Enter student's phone number: ");

    //attempt to read one line of input
    if ( fgets( Student1.phone_number, sizeof Student1.phone_number, stdin ) == NULL )
    {
        printf( "input error!\n" );
        exit( EXIT_FAILURE );
    }

    //attempt to find newline character, in order to verify that
    //the entire line was read in
    p = strchr( Student1.phone_number, '\n' );
    if ( p == NULL )
    {
        printf( "line too long for input!\n" );
        exit( EXIT_FAILURE );
    }

    //remove newline character by overwriting it with terminating
    //null character
    *p = '[=10=]';

    //write phone number to file
    fprintf( filePtr, "%s\n", Student1.phone_number );

    //cleanup
    fclose( filePtr );
}