C str[i-1]=='';什么意思?
我一直在复习一个程序,它将字符串中每个单词的第一个字母大写。例如,C str[i-1]=='';什么意思?,c,string,if-statement,pointers,conditional-statements,C,String,If Statement,Pointers,Conditional Statements,我一直在复习一个程序,它将字符串中每个单词的第一个字母大写。例如,“每一天”变成了“每一天” 我不懂这个部分。那有什么用 #include <stdio.h> char *ft_strcapitalize(char *str) { int i; i = 0; while (str[i] != '\0') { if ((i == 0 || str[i - 1] == ' ') &&
“每一天”
变成了“每一天”
我不懂这个部分。那有什么用
#include <stdio.h>
char *ft_strcapitalize(char *str)
{
int i;
i = 0;
while (str[i] != '\0')
{
if ((i == 0 || str[i - 1] == ' ') &&
(str[i] <= 'z' && str[i] >= 'a'))
{
str[i] -= 32;
}
else if (!(i == 0 || str[i - 1] == ' ') &&
(str[i] >= 'A' && str[i] <= 'Z'))
{
str[i] += 32;
}
i++;
}
return (str);
}
int main(void)
{
char str[] = "asdf qWeRtY ZXCV 100TIS";
printf("\n%s", ft_strcapitalize(str));
return (0);
}
#包括
char*ft_strcapitalize(char*str)
{
int i;
i=0;
while(str[i]!='\0')
{
如果((i==0 | | str[i-1]=='')&&
(str[i]=“a”))
{
str[i]=32;
}
else如果(!(i==0 | | str[i-1]='')&&
(str[i]>='A'&&str[i]在这里,您将str[i-1]
与字符空格
,其ASCII码为32
e、 g
执行此代码段,如果比较结果为值1,则为真,否则为假。将str[]=“Ryan Mney”
放入比较,然后进行比较,您就会明白,发生了什么事?i
是您正在考虑大写的当前字符字符串中的索引(记住它从0开始)
i-1
是前一个字符的字符串中您正在考虑的字符的索引
str[i-1]
是位于您考虑的角色之前的角色
=''
正在将该字符与空格字符进行比较
因此,str[i-1]='
的意思是“这个字符左边的字符是空格吗?”C语言提供了许多有用的字符宏,这些宏既可以使代码更便携,也更可读。虽然正在审阅的示例代码不使用这些宏,但请考虑使用这些宏使代码更便携、更健壮,更容易供他人阅读。
请使用islower/isupper/isalpha和tolower/toupper宏;这些ctype宏使C语言字符串处理更易于阅读
- islower(ch)-检查ch是否为小写
- isupper(ch)-检查ch是否为大写
- isalpha(ch)-检查ch是否为字母(小写或大写)
- tolower(ch)-将ch转换为小写(如果是字母)
- toupper(ch)-将ch转换为大写(如果是字母)
是的,它们是宏-
C语言提供了“for”控制语句,它提供了一种很好的方式来表示字符串处理。简单的索引循环通常使用“for”而不是“while”来编写
#include <ctype.h>
char*
ft_strcapitalize(char *str)
{
for( int i=0; (str[i] != '\0'); i++ )
{
if ((i == 0 || isspace(str[i - 1])) && islower(str[i]) )
{
str[i] = toupper(str[i]);
}
else if (!(i == 0 || str[i - 1] == ' ') && isupper(str[i]) )
{
str[i] = tolower(str[i]);
}
}
return (str);
}
或者,使用isalpha(ch)
通过首先执行特殊情况(字符串的第一个字符),进一步简化条件表达式
同样,备用isalpha(ch)版本
更惯用的说法是,只需使用一个“state”标志,指示我们应该折叠成大写还是小写
char*
ft_strcapitalize(char *str)
{
int first=1;
for( char* p=str; *p; p++ ) {
if( isspace(*p) ) {
first = 1;
}
else if( !isspace(*p) ) {
if( first ) {
if( isalpha(str[i]) ) str[i] = toupper(str[i]);
first = 0;
}
else {
if( isalpha(str[i]) ) str[i] = tolower(str[i]);
}
}
}
return(str);
}
还有你的主要测试驾驶员
int main(void)
{
char str[] = "asdf qWeRtY ZXCV 100TIS";
printf("\n%s", ft_strcapitalize(str));
return (0);
}
“str[i-1]=''
是什么意思?”
”
是空白字符的字符常量(ASCII值32)
str
是一个指针,指向调用者中的char
(实际上,它应该指向一个char
数组,其中包含一个字符串,而不仅仅是一个char
)
i
是一个计数器
注意,C语法允许对指针使用数组表示法。因此,
str[1]
等于*(str+1)
str[i-1]
中的[i-1]
表示在元素str[i]
指向之前访问该元素
将指向的元素str[i-1]
与空白字符进行比较(如果指向的元素str[i-1]
实际包含空白)
如果是这种情况,条件的计算结果为true
,否则条件为false
旁注:
- 请注意,
在str[i-1]
时可能是危险的。然后您会尝试访问指向数组边界以外的内存。但在您的情况下,这是安全的,因为i==0
仅在str[i-1]='
由于逻辑OR而不是i==0
时才进行计算true
因此,在您的代码中考虑了这种情况if ((i == 0 || str[i - 1] == ' ')
相当于str[i]-=32;
。后一种形式可以提高可读性,因为它突出了大写的性质str[i]-='a'-'a';
if ((i == 0 || str[i - 1] == ' ')
检查我们是否正在查看字符串开头或其前一行是空格,即检查是否遇到新词。
在字符串“every single day”中,i=0
位于粗体位置,在下一种情况下,“每s一天”、
i=6
和str[i-1]
是'
标记遇到的新词'
是一个字符常量,表示执行集中空格字符的值。使用'
而不是32
可以提高系统的可读性和可移植性,因为空格的值可能与ASCII字符中的值不同set.(i==0 | | str[i-1]='')
为真,如果i
是单词列表中以空格分隔的单词开头的偏移量
重要的是要尽可能使代码简单易读。当更具表现力的替代方法简单且便宜时,不建议使用像32
这样的魔法常量。例如,使用str[i]-=32将小写字符转换为大写:此魔法值32
(再次!)正好是小写字符和大写字符之间的偏移量。写入时可读性更好:
str[i] -= 'a' - 'A';
类似地,您以相反的顺序编写了小写和大写的范围测试:这很容易出错,让读者感到惊讶
您还将在开始时重复此测试
char*
ft_strcapitalize(char *str)
{
int first=1;
for( char* p=str; *p; p++ ) {
if( isspace(*p) ) {
first = 1;
}
else if( !isspace(*p) ) {
if( first ) {
if( isalpha(str[i]) ) str[i] = toupper(str[i]);
first = 0;
}
else {
if( isalpha(str[i]) ) str[i] = tolower(str[i]);
}
}
}
return(str);
}
int main(void)
{
char str[] = "asdf qWeRtY ZXCV 100TIS";
printf("\n%s", ft_strcapitalize(str));
return (0);
}
if ((i == 0 || str[i - 1] == ' ')
if ((i == 0 || str[i - 1] == ' ')
str[i] -= 'a' - 'A';