如何解决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
被认为是假的(由于为零),而其他一切都被认为是真的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。