从用户那里获取整数时使用空格
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,此函数将从您作为参数传递的字符串中删除空格。
输入:
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 );
}
我正在尝试练习一些有关文本文件、打印和读取文本的内容。我需要从用户那里获取输入 - 也许是他们的 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,此函数将从您作为参数传递的字符串中删除空格。
输入:
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 );
}