检查字符串是否只是字母和空格

时间:2015-06-07 15:06:33

标签: c arrays string function

我编写了这个简单的代码来检查字符串是否仅为字母和空格

#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

但如果我在空格后键入任何内容,则返回1,如下所示:

hello 1220  //returns 1

blabla 11sdws // returns 1

有人可以告诉我原因吗?

6 个答案:

答案 0 :(得分:3)

如果使用标题isalpha中声明的标准C函数isblank<ctype.h>,则可以更简单,更正确地编写函数。例如

#include <ctype.h>

//...

int checkString( const char s[] )
{
    unsigned char c;

    while ( ( c = *s ) && ( isalpha( c ) || isblank( c ) ) ) ++s;

    return *s == '\0'; 
}

如果要检查字符串是否包含空格,则应使用函数isblank而不是函数isspace

考虑到在这样的简单循环中使用语句continue不是一个好主意。最好在没有continue语句的情况下重写循环。

而不是函数scanf如果你想输入一个句子,最好使用函数fgets该函数允许输入几个单词作为一个字符串,直到按下Enter键。

例如

fgets( str1, sizeof( str1 ), stdin );

考虑到该功能包含新行字符。所以输入一个字符串后你应该删除这个字符。例如

size_t n = strlen( str1 );
if ( n != 0 && str1[n-1] == '\n' ) str1[n-1] = '\0';

答案 1 :(得分:0)

你忘记了数字

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;
}

答案 2 :(得分:0)

这种情况正在发生,因为您正在使用scanf(%s,&amp; str)进行输入。以这种方式输入只存储空格\ n或其他空白字符之前的字符。因此,当您输入空格时,输入仅存储到空间。

例如,您输入了helloo 1234   你的str只存储了helloo,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;
 }  

答案 3 :(得分:0)

输入字符串存在问题 scanf()只会将您的输入视为空格whitespace

因此,当您输入 hello 1234 实际输入时,检查的是 hello 。通过打印您输入的内容(即打印str1)来检查这一点。然后你会在这段代码中知道错误。

您可以使用getsfgets来解决问题。

答案 4 :(得分:0)

当您使用scanf("%s",str1);时,输入hello 112,str1获取的是hello。因此您可以使用fgets(str1,N,stdin);来获取字符串。我认为它会起作用。

答案 5 :(得分:0)

如果您回扫字符串,只需扫描(),您将注意到它只获得所有输入的第一部分。即,忽略包括白色空格的白色空间之后的任何内容。 你可以使用getch()(windows)或getchar()(linux)来获取每个char输入,并在你有一个&#34; \ n&#34; (换行)

来源: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;
}