C 我该怎么说;如果;将语句转换到此代码中以检查非字母字符?

C 我该怎么说;如果;将语句转换到此代码中以检查非字母字符?,c,C,该代码用于将字母数字从小写字母转换为大写字母,反之亦然;但是,如果插入非字母字符,则应返回错误 #include<stdio.h> #include<stdlib.h> int main (void) { int c = 0; char ch, s[1000]; printf("Enter a string of upper and lower case letters\n"); scanf("%s&quo

该代码用于将字母数字从小写字母转换为大写字母,反之亦然;但是,如果插入非字母字符,则应返回错误

#include<stdio.h>
#include<stdlib.h>

int main (void)
{
    int c = 0;
    char ch, s[1000];

    printf("Enter a string of upper and lower case letters\n");
    scanf("%s", s);
}
#包括
#包括
内部主(空)
{
int c=0;
char-ch,s[1000];
printf(“输入一串大小写字母\n”);
scanf(“%s”,s);
}

始终保护您的代码不受Buffer溢出的影响:

scanf("%999s", s);
而不是

scanf("%s", s);
关于您的问题,您可以使用
isalpha
tolower
touper

#include <ctype.h>
...
scanf("%999s", s);

char *p = s;

while (*p)
{
    unsigned char c = (unsigned char)*p;

    if (!isalpha(c))
    {
        // there are non alpha chars
        // return 0;
    }
    else
    {
        *p = islower(c) ? toupper(c) : tolower(c);
    }
    p++;
}
#包括
...
扫描频率(“%999s”,s);
char*p=s;
而(*p)
{
无符号字符c=(无符号字符)*p;
如果(!isalpha(c))
{
//有非阿尔法字符
//返回0;
}
其他的
{
*p=岛下(c)→岛上(c):岛下(c);
}
p++;
}

始终保护您的代码不受Buffer溢出的影响:

scanf("%999s", s);
而不是

scanf("%s", s);
关于您的问题,您可以使用
isalpha
tolower
touper

#include <ctype.h>
...
scanf("%999s", s);

char *p = s;

while (*p)
{
    unsigned char c = (unsigned char)*p;

    if (!isalpha(c))
    {
        // there are non alpha chars
        // return 0;
    }
    else
    {
        *p = islower(c) ? toupper(c) : tolower(c);
    }
    p++;
}
#包括
...
扫描频率(“%999s”,s);
char*p=s;
而(*p)
{
无符号字符c=(无符号字符)*p;
如果(!isalpha(c))
{
//有非阿尔法字符
//返回0;
}
其他的
{
*p=岛下(c)→岛上(c):岛下(c);
}
p++;
}

在插入任何
之前,如果
您需要一个循环来包含它。然后探索函数
isupper()
tolower()
if((somechar=>A'&&somechar'A'&&somechar@Jabberwocky为什么?这里有
isaplha
函数。甚至不是:
if(isupper(…){}else if(islower(…){}else{/*error*}
@EugeneSh。我知道,我编辑了评论。但由于他是一个绝对的初学者,我认为在插入任何
if
之前,还需要演示如何“手动”完成。然后探索函数
isupper()
tolower()
if((somechar=>'A'&&somechar'A'&&somechar@Jabberwocky为什么?有
isaplha
函数。甚至不是:
if(isupper(…){}else if(islower(…){else{else{/*error*/}
@EugeneSh。我知道,我编辑了这个评论。但他是一个绝对的初学者,我认为值得向他展示一下如何“手工”完成它,为什么(正确)在将
*p
的值传递给
isalpha
之前,强制转换为
unsigned char
,但对
islower
toupper
tolower
不执行相同的操作。如果
*p
为负值,则会导致未定义的行为(除非它恰好是
EOF
)。与四次强制转换不同,对临时
int
变量强制转换一次可能更容易。@AndreasWenzel如果
isalpha
返回true,则无需强制转换其余调用,
char
肯定在[
'a'
..
'z'
]或[
'a'
-
'z'
]如果使用的区域设置不是
“C”
,则该函数还可以为字符
>127
返回true。编辑后,您的代码现在看起来很好。实际上,这可能不会造成任何问题,因为Microsoft C运行时库和GNU C库都允许所有这些函数都使用负值(即使ISO C标准没有)。大多数其他库在这方面也可能是宽容的。但是,即使大多数标准库实现在这方面是宽容的,强制转换到
无符号字符
仍然很重要,因为如果不这样做,则标准库无法将
EOF
与实际字符区分开来。例如,如果
EOF
定义为
-1
,则标准库无法将其与字符号255区分开来,因此标准库必须将该字符视为与
EOF
相同的字符(例如,将其视为非字母顺序,即使是字母顺序)。如果使用正确的方法,则不存在此问题。为什么在将
*p
的值传递给
isalpha
之前(正确地)强制转换为
无符号字符
,但对于
islower
toupper
tolower
不执行相同的操作?如果
*p
为负值,则会导致未定义的行为(除非它恰好是
EOF
)。与其施放四次,对一个临时
int
变量施放一次可能更容易。@AndreasWenzel如果
isalpha
返回true,则不需要施放其余调用,
char
肯定在[
'a'
..
'z'
]范围内,或者[
'A'
-
'Z'
]如果区域设置不是
“C”,则函数还可以为字符
>127
返回true
已被使用。编辑后,您的代码现在看起来很好。实际上,这可能不会造成任何问题,因为Microsoft C运行时库和GNU C库都允许所有这些函数使用负值(即使ISO C标准不允许)。大多数其他库在这方面也可能是宽容的。但是,即使大多数标准库实现在这方面是宽容的,强制转换到
无符号字符
仍然很重要,因为如果不这样做,则标准库无法将
EOF
与实际字符区分开来。例如,如果
EOF
被定义为
-1
,那么标准库无法将其与字符号255区分开来,因此标准库必须将该字符与
EOF
一样处理(例如,将其视为非字母顺序,即使是)。如果使用正确的方法,则不存在此问题。