Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C str[i-1]=='';什么意思?_C_String_If Statement_Pointers_Conditional Statements - Fatal编程技术网

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]='
    仅在
    i==0
    由于逻辑OR而不是
    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';