c - 如何将字符串转换为单个字母char

问题描述

我正在尝试对输入的字符串运行 isalpha 检查,但问题是,isalpha 显然仅适用于单个字符。如果我像这样在字符串上运行它,就会出现分段错误。

可能有更优雅的解决方案,但我找不到将字符串与 char 数组连接起来的方法,这是唯一缺少的部分

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

int i;

int main (void)    
{
    
    string text = get_string("Text: \n");

    int lenght = strlen(text);

    if(isalpha(text))
    {
        printf("Well done");
    }
    else
    {
        printf("You suck");
    }

所以我尝试将字符串转换为每个单独的字符数组。否认可能有更优雅的解决方案的事实,我找不到将字符串与 char 数组连接起来的方法,这是唯一缺少的部分

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

int i;

int main (void)    
{
    
    string text = get_string("Text: \n");
    int lenght = strlen(text);
    char letter[lenght];
    

    for(i = 0; i < lenght; i++)
    {
        
        printf("Letter %i is %c\n",i,letter[i]);

    }

}

有什么建议可以在我继续执行实际功能之前对我的字符串运行 isalpha 检查吗?

解决方法

只需编写一个执行此类检查的函数即可。

它可以如下面的演示程序所示。

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

int is_all_alpha( const char *s )
{
    while ( *s && isalpha( ( unsigned char )*s ) ) ++s;
    
    return *s == '\0';
}

int main(void) 
{
    char *s1 = "Hello";
    char *s2 = "2021";
    
    printf( "\"%s\" is %sa valid word\n",s1,is_all_alpha( s1 ) ? "" : "not " );
    printf( "\"%s\" is %sa valid word\n",s2,is_all_alpha( s2 ) ? "" : "not " );

    return 0;
}

程序输出为

"Hello" is a valid word
"2021" is not a valid word

或者使用名称 string 的定义,程序可以看起来像

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

int is_all_alpha( string s )
{
    while ( *s && isalpha( ( unsigned char )*s ) ) ++s;
    
    return *s == '\0';
}

int main(void) 
{
    string s1 = "Hello";
    string s2 = "2021";
    
    printf( "\"%s\" is %sa valid word\n",is_all_alpha( s2 ) ? "" : "not " );

    return 0;
}

尽管将函数参数声明为具有类型 const char * 而不是 string 更好,因为在函数 is_all_alpha 中指向的字符串没有改变。并且类型 const string 与类型 const char * 不同。类型 const string 是类型 char * const 的别名,这意味着传递的指针本身是常量,而不是指针指向的字符串。

您可以使用 if-else 语句来代替 printf 调用中使用的条件运算符。例如

if ( is_all_alpha( text ) )
{
    // all symbols of text are letters
    // do something
}
else
{
    // text contains a non-alpha symbol
    // do something else
}
,

在 CS50 的标头中,它们将 string 定义为 char*。因此,您的 string 已经是一个 char 数组,无需对其进行转换。您可以使用简单的 strlen 构造:

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

int main (void) {
    string text = get_string("Text: \n");
    int len = strlen(text);
    
    bool allAlpha = true;
    for(int i = 0; i < len; i++) {
        if (!isAlpha(text[i])) {
            allAlpha = false;
            break;
        }
    }
    if (allAlpha) {
        printf("Everything's alphabetical.\n");
    } else {
        printf("There's a non-alphabetical character.");
    }
}

虽然,这必须遍历字符串两次,因为 strlen 遍历整个数组。您可以做的一件事是前进指针,并继续前进,直到找到末尾的空字节:

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

int main (void) {
    string text = get_string("Text: \n");
    
    bool allAlpha = true;
    for(char* ptr = text; *ptr != '\0'; ptr++) {
        if (!isAlpha(*ptr)) {
            allAlpha = false;
            break;
        }
    }
    if (allAlpha) {
        printf("Everything's alphabetical.\n");
    } else {
        printf("There's a non-alphabetical character.");
    }
}

!= '\0' 经常被省略,因为 \0 被认为是假的(由于为零),而其他一切都被认为是真的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...