检查字符串是否只有字母和空格
Checking if string is only letters and spaces
我写了这个简单的代码来检查一个字符串是否是字母并且 space 只是
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define N 100
int checkString(char str1[]);
void main()
{
char str1[N];
scanf("%s", str1);
printf("%d",checkString(str1));
getch();
}
int checkString(char str1[])
{
int i, x=0, p;
p=strlen(str1);
for (i = 0; i < p ; i++)
{
if ((str1[i] >= 'a' && str1[i] <= 'z') || (str1[i] >= 'A' && str1[i] <= 'Z') || (str1[i] == ' '))
{
continue;
}
else{ return 0; }
}
return 1;
}
当我输入类似 :
的内容时,它工作正常
hello asds //returns 1
hello1010 sasd // return 0
但是如果我在 space 之后输入任何内容 returns 1
,就像这样:
hello 1220 //returns 1
blabla 11sdws // returns 1
谁能告诉我为什么?
你忘了数字
int checkString(char str1[]) {
int i, x=0, p;
p=strlen(str1);
for (i = 0; i < p ; i++)
if ((str1[i] >= 'a' && str1[i] <= 'z') || (str1[i] >= 'A' && str1[i] <= 'Z') || (str1[i] == ' ') || (str1[i] >= '0' && str1[i] <= '9')) {
continue;
} else return 0;
return 1;
}
或更好
#include <ctype.h>
...
int checkString(char str1[]) {
int i, x=0, p;
p=strlen(str1);
for (i = 0; i < p ; i++)
if (isalnum(str1[i]) || (str1[i] == ' '))
continue;
else return 0;
return 1;
}
如果使用在header <ctype.h>
中声明的标准C函数isalpha
和isblank
,函数可以写得更简单和正确 例如
#include <ctype.h>
//...
int checkString( const char s[] )
{
unsigned char c;
while ( ( c = *s ) && ( isalpha( c ) || isblank( c ) ) ) ++s;
return *s == '[=10=]';
}
如果你想检查一个字符串是否包含空格,那么你应该使用函数 isspace
.
而不是函数 isblank
请注意,在这种简单的循环中使用语句 continue
并不是一个好主意。最好重写没有 continue
语句的循环。
如果您想输入一个句子,最好使用函数 fgets
而不是函数 scanf
该函数允许将多个单词作为一个字符串输入,直到按下 Enter。
例如
fgets( str1, sizeof( str1 ), stdin );
考虑到该函数包含换行符。所以在输入一个字符串后你应该删除这个字符。例如
size_t n = strlen( str1 );
if ( n != 0 && str1[n-1] == '\n' ) str1[n-1] = '[=12=]';
发生这种情况是因为您正在使用 scanf(%s,&str) 获取输入。在这种方式下,只存储 space \n 之前的字符或其他白色 space 字符。因此,当您输入 space 时,输入仅存储到 space.
例如,您输入 hello 1234
您的 str 仅存储 hello 并且 1234 保留在缓冲区中。尝试使用 getchar()。
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define N 100
int checkString(char str1[]);
void main()
{
char str1[N];
int i=0;
while(1)
{
str1[i++]=getchar();
if(str1[i-1]=='\n') break;
}
printf("%d",checkString(str1));
getch();
}
int checkString(char str1[])
{
int i, x=0, p;
p=strlen(str1);
for (i = 0; i < p ; i++)
{
if ((str1[i] >= 'a' && str1[i] <= 'z') || (str1[i] >= 'A' && str1[i] <= 'Z') || (str1[i] == ' '))
{
continue;
}
else{ return 0; }
}
return 1;
}
您输入的字符串有问题
scanf()
这将使您的输入达到 space 仅当它是 whitespace
因此,当您输入 hello 1234 时,它正在检查的实际输入是 hello 。通过打印您正在输入的内容(即打印 str1
)来检查这一点。然后你就会知道这段代码中的错误。
您可以使用gets
或fgets
来解决问题。
当你使用scanf("%s",str1);
时,你输入hello 112
,str1得到的是hello
。所以你可以使用fgets(str1,N,stdin);
得到string.I的想法它会起作用。
如果您打印回刚刚 scanf()ed 的字符串,您会注意到它只获取所有输入的第一部分。即白色 space 之后的任何内容,包括白色 space 都将被忽略。
您可以使用 getch() (windows) 或 getchar() (linux) 获取每个字符输入并在您有“\n”(换行符)
时终止
来源:http://www.cplusplus.com/reference/cstdio/scanf/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define N 100
int checkString(char str1[]);
void main()
{
int i = 0;
int c;
char str1[N];
memset(str1, 0, sizeof(str1));
do {
c = getchar();
str1[i++] = c;
} while ((c != '\n') && (i < (N - 1))); // (i < N - 1) reserves one place for null char
// last char is '\n' - remove it.
str1[i-1] = 0;
printf("Result: %s\n", checkString(str1) ? "letters and/or spaces only" : "other characters other than spaces and/or letters present");
}
// expects a null terminated string
int checkString(char str1[])
{
char* p = str1;
while (*p) {
if (!isalpha(*p) && !isspace(*p)) {
return 0;
}
p++;
}
return 1;
}
我写了这个简单的代码来检查一个字符串是否是字母并且 space 只是
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define N 100
int checkString(char str1[]);
void main()
{
char str1[N];
scanf("%s", str1);
printf("%d",checkString(str1));
getch();
}
int checkString(char str1[])
{
int i, x=0, p;
p=strlen(str1);
for (i = 0; i < p ; i++)
{
if ((str1[i] >= 'a' && str1[i] <= 'z') || (str1[i] >= 'A' && str1[i] <= 'Z') || (str1[i] == ' '))
{
continue;
}
else{ return 0; }
}
return 1;
}
当我输入类似 :
的内容时,它工作正常hello asds //returns 1
hello1010 sasd // return 0
但是如果我在 space 之后输入任何内容 returns 1
,就像这样:
hello 1220 //returns 1
blabla 11sdws // returns 1
谁能告诉我为什么?
你忘了数字
int checkString(char str1[]) {
int i, x=0, p;
p=strlen(str1);
for (i = 0; i < p ; i++)
if ((str1[i] >= 'a' && str1[i] <= 'z') || (str1[i] >= 'A' && str1[i] <= 'Z') || (str1[i] == ' ') || (str1[i] >= '0' && str1[i] <= '9')) {
continue;
} else return 0;
return 1;
}
或更好
#include <ctype.h>
...
int checkString(char str1[]) {
int i, x=0, p;
p=strlen(str1);
for (i = 0; i < p ; i++)
if (isalnum(str1[i]) || (str1[i] == ' '))
continue;
else return 0;
return 1;
}
如果使用在header <ctype.h>
中声明的标准C函数isalpha
和isblank
,函数可以写得更简单和正确 例如
#include <ctype.h>
//...
int checkString( const char s[] )
{
unsigned char c;
while ( ( c = *s ) && ( isalpha( c ) || isblank( c ) ) ) ++s;
return *s == '[=10=]';
}
如果你想检查一个字符串是否包含空格,那么你应该使用函数 isspace
.
isblank
请注意,在这种简单的循环中使用语句 continue
并不是一个好主意。最好重写没有 continue
语句的循环。
如果您想输入一个句子,最好使用函数 fgets
而不是函数 scanf
该函数允许将多个单词作为一个字符串输入,直到按下 Enter。
例如
fgets( str1, sizeof( str1 ), stdin );
考虑到该函数包含换行符。所以在输入一个字符串后你应该删除这个字符。例如
size_t n = strlen( str1 );
if ( n != 0 && str1[n-1] == '\n' ) str1[n-1] = '[=12=]';
发生这种情况是因为您正在使用 scanf(%s,&str) 获取输入。在这种方式下,只存储 space \n 之前的字符或其他白色 space 字符。因此,当您输入 space 时,输入仅存储到 space.
例如,您输入 hello 1234 您的 str 仅存储 hello 并且 1234 保留在缓冲区中。尝试使用 getchar()。
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define N 100
int checkString(char str1[]);
void main()
{
char str1[N];
int i=0;
while(1)
{
str1[i++]=getchar();
if(str1[i-1]=='\n') break;
}
printf("%d",checkString(str1));
getch();
}
int checkString(char str1[])
{
int i, x=0, p;
p=strlen(str1);
for (i = 0; i < p ; i++)
{
if ((str1[i] >= 'a' && str1[i] <= 'z') || (str1[i] >= 'A' && str1[i] <= 'Z') || (str1[i] == ' '))
{
continue;
}
else{ return 0; }
}
return 1;
}
您输入的字符串有问题
scanf()
这将使您的输入达到 space 仅当它是 whitespace
因此,当您输入 hello 1234 时,它正在检查的实际输入是 hello 。通过打印您正在输入的内容(即打印 str1
)来检查这一点。然后你就会知道这段代码中的错误。
您可以使用gets
或fgets
来解决问题。
当你使用scanf("%s",str1);
时,你输入hello 112
,str1得到的是hello
。所以你可以使用fgets(str1,N,stdin);
得到string.I的想法它会起作用。
如果您打印回刚刚 scanf()ed 的字符串,您会注意到它只获取所有输入的第一部分。即白色 space 之后的任何内容,包括白色 space 都将被忽略。 您可以使用 getch() (windows) 或 getchar() (linux) 获取每个字符输入并在您有“\n”(换行符)
时终止来源:http://www.cplusplus.com/reference/cstdio/scanf/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define N 100
int checkString(char str1[]);
void main()
{
int i = 0;
int c;
char str1[N];
memset(str1, 0, sizeof(str1));
do {
c = getchar();
str1[i++] = c;
} while ((c != '\n') && (i < (N - 1))); // (i < N - 1) reserves one place for null char
// last char is '\n' - remove it.
str1[i-1] = 0;
printf("Result: %s\n", checkString(str1) ? "letters and/or spaces only" : "other characters other than spaces and/or letters present");
}
// expects a null terminated string
int checkString(char str1[])
{
char* p = str1;
while (*p) {
if (!isalpha(*p) && !isspace(*p)) {
return 0;
}
p++;
}
return 1;
}