我试图对输入的字符串运行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的标头中,他们键入defstring
到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 != ' '; ptr++) {
if (!isAlpha(*ptr)) {
allAlpha = false;
break;
}
}
if (allAlpha) {
printf("Everything's alphabetical.n");
} else {
printf("There's a non-alphabetical character.");
}
}
!= ' '
经常被省略,因为