在打印出首字母的C程序中不理解的行为

在打印出首字母的C程序中不理解的行为,c,for-loop,conditional,cs50,C,For Loop,Conditional,Cs50,我有一个简单的C程序,它应该接受用户给定的名称,然后在标准输出中打印出名称的首字母。我的执行情况如下: #include <stdio.h> #include <cs50.h> #include <string.h> int main(int argc, string argv[]) { string name = GetString(); printf("%c\n", name[0]); // print out the very fir

我有一个简单的C程序,它应该接受用户给定的名称,然后在标准输出中打印出名称的首字母。我的执行情况如下:

#include <stdio.h>
#include <cs50.h>
#include <string.h>

int main(int argc, string argv[])
{
    string name = GetString();
    printf("%c\n", name[0]);  // print out the very first initial of the complete name

    for(int i = 1; i< strlen(name); i++)
    {
        string blank_space = " ";
        printf("name[i] = %c \n", name[i]);
        printf("i = %d, blank_space = %s,strcmp = %d\n", i, blank_space, strcmp(&name[i - 1], blank_space));
        if (strcmp(&name[i - 1], blank_space) == 0)
        {
            printf("%c\n", name[i]);
        }
        else
        {
            continue;
        }
    }

    return 0;
} 
它所做的只是打印出A。真正让我困惑的是,为什么strcmp&name[i-1],即使name[i-1]是一个空格,空格也会返回值1,在执行strcmp时,它的计算结果应该与空格变量的计算结果相同。当我用printf打印它们时,它们看起来都一样

我将非常感谢您对我的问题给予的任何帮助,我非常重视任何改进建议


仅供参考:这实际上来自Edx课程CS50的习题集2。因此,cs50.h是课程中提供的头文件,它为我们提供了特殊类型(如string)和独特函数(如GetString)。

发生这种情况的原因是您没有正确地检查空间。应该这样做:

if (name[i - 1] == ' ')

比较strcmp和name[i-1],只有当name的整个后缀从i-1开始与空格(一个包含单个空格字符的字符串)匹配时,空格才起作用。这只能在以空格字符结尾的字符串末尾执行,因此它不适用于您的输入。

以下是您可能要查找的内容:

int seen_space = 1; // The first character is assumed to be initial
for (int i = 0; name[i]; ++i)
{
    if (isspace((unsigned char)name[i]))
    {
       seen_space = 1;
    }
    else if (seen_space)
    {
        printf("%c", name[i]);
        seen_space = 0;
    }
}
printf("\n");
strcmp比较两个字符串,直到找到两个字符串的null\0并返回零

你所做的是把Koh和显然不相等的Koh进行比较

你应该像这样搜索空间

if(name[i - 1] == ' ')
{
   \\space found
}

对您的程序来说,侵入性较小的更改是将strcmp更改为strncmp,并且有许多要点需要讨论。因为strcmp将长度相等的字符串比较为相等。对于strcmp,这将永远不会发生,因为第一个参数字符串总是比第二个空格长。由于循环永远找不到空格,因此只打印第一个字母

更改:

   if (strcmp(&name[i - 1], blank_space) == 0)

如果要比较子字符串或

   if( name[i-1]==blank_space )

如果你想比较单个字母。

你确定这是C代码吗?我猜cs50.h中有一些讨厌的东西,比如typedef char*string;,函数GetString.strcmp不是正确的函数。你把福比作。这些字符串不相等。请查看ctype.h标题,对ascii字符进行分类。但是cs50头球是邪恶的。这种字符串类型令人讨厌。而且,可能不需要每次在循环中定义空格。@Jiminion问得好,但至少在PSet2中,我们得到了一些假设,其中包括名称之间最多有一个空格。我们也可以假设像O'Brien这样的名字不会被使用。你需要重新设置SEED_空间。
   if (strncmp(&name[i - 1], blank_space,1) == 0)
   if( name[i-1]==blank_space )