简体   繁体   English

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

[英]How to convert a string into individual letters char in c

I'm trying to run an isalpha check on an entered string but the issue is, that isalpha works only for individual characters apparently.我正在尝试对输入的字符串运行 isalpha 检查,但问题是,isalpha 显然仅适用于单个字符。 If I run it like this on a string, I get a segmentation fault.如果我像这样在字符串上运行它,则会出现分段错误。

There might be a more elegant solution, but I can not find a way to connect the string with the char array which is the only missing piece可能有更优雅的解决方案,但我找不到将字符串与唯一缺失的 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");
    }

So I tried to transform the string into each individual char array.所以我尝试将字符串转换为每个单独的 char 数组。 dispate the fact that there might be a more elegant solution, I can not find a way to connect the string with the char array which is the only missing piece消除可能有更优雅的解决方案的事实,我找不到将字符串与唯一缺失的 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]);

    }

}

Any piece of advice how I can run the isalpha check on my string before I continue to the actual function?在继续实际的 function 之前,有什么建议可以对我的字符串运行 isalpha 检查吗?

Just write a function that will perform such a check.只需编写一个 function 即可执行此类检查。

It can look the following way as it is shown in the demonstrative program below.它可以如下面的演示程序所示。

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

The program output is程序 output 是

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

Or using the definition of the name string the program can look like或者使用名称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", s1, is_all_alpha( s1 ) ? "" : "not " );
    printf( "\"%s\" is %sa valid word\n", s2, is_all_alpha( s2 ) ? "" : "not " );

    return 0;
}

Though it is much better to declare the function parameter as having the type const char * instead of string because within the function is_all_alpha the pointed string is not changed.尽管将 function 参数声明为具有类型const char *而不是string要好得多,因为在 function is_all_alpha中,指向的字符串没有改变。 And the type const string is not the same as the type const char * .并且const string类型与const char *类型不同。 The type const string is an alias for the type char * const that is it means that the passed pointer itself is constant not the string pointed to by the pointer. const string类型是char * const类型的别名,这意味着传递的指针本身是常量,而不是指针指向的字符串。

Instead of the conditional operator used in the calls of printf you can use if-else statements.您可以使用 if-else 语句来代替 printf 调用中使用的条件运算符。 For example例如

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

In CS50's header, they typedef string to char* .在 CS50 的 header 中,他们 typedef stringchar* So, your string is already a char array, and there's no need to convert it.因此,您的string已经是一个char数组,无需对其进行转换。 You could use a simple strlen construction:您可以使用简单的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.");
    }
}

Although, this has to loop through the string twice, since strlen loops through the whole array.虽然,这必须循环遍历字符串两次,因为strlen循环遍历整个数组。 One thing you can do is to advance the pointer, and keep going until you find the null byte at the end:您可以做的一件事是推进指针,并继续前进,直到在末尾找到 null 字节:

#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.");
    }
}

The != '\0' is frequently omitted, since \0 is considered as false (due to being zero), and everything else is considered as true. != '\0'经常被省略,因为\0被认为是假的(因为为零),而其他一切都被认为是真。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM