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



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

可能有一个更优雅的解决方案,但我找不到将字符串与char数组连接起来的方法,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数组。抛开可能有更优雅的解决方案这一事实不谈,我找不到将字符串与char数组连接起来的方法,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 %cn", 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 == '';
}
int main(void) 
{
char *s1 = "Hello";
char *s2 = "2021";

printf( ""%s" is %sa valid wordn", s1, is_all_alpha( s1 ) ? "" : "not " );
printf( ""%s" is %sa valid wordn", 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 == '';
}
int main(void) 
{
string s1 = "Hello";
string s2 = "2021";

printf( ""%s" is %sa valid wordn", s1, is_all_alpha( s1 ) ? "" : "not " );
printf( ""%s" is %sa valid wordn", s2, 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的标头中,他们键入defstringchar*。因此,您的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 != ''; ptr++) {
if (!isAlpha(*ptr)) {
allAlpha = false;
break;
}
}
if (allAlpha) {
printf("Everything's alphabetical.n");
} else {
printf("There's a non-alphabetical character.");
}
}

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

相关内容

  • 没有找到相关文章

最新更新