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

Behavior not understood in C program that prints out initials

我有一个简单的 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;
} 

如果我给程序输入类似 Aug Koh 的东西,那么它应该返回 AK 作为输出。然而,当我尝试调试我的程序时,我似乎无法弄清楚它出了什么问题。这是我的程序的标准输出:

jharvard@ubuntu (~/pset2): ./initials 
Aug Koh
A
name[i] = u 
i = 1, blank_space =  ,strcmp = 1
name[i] = g 
i = 2, blank_space =  ,strcmp = 1
name[i] =   
i = 3, blank_space =  ,strcmp = 1
name[i] = K 
i = 4, blank_space =  ,strcmp = 1
name[i] = o 
i = 5, blank_space =  ,strcmp = 1
name[i] = h 
i = 6, blank_space =  ,strcmp = 1

它所做的就是打印出 A。真正让我困惑的是为什么 strcmp(&name[i - 1], blank_space) returns 的值是 1 即使 name[i - 1] 是空白 space 的情况下,它的计算结果应该与blank_space 执行 strcmp 时的变量。当我用 printf 打印出它们时,它们看起来都一样!

任何帮助我的问题将不胜感激,我非常重视任何改进建议。

仅供参考:这实际上来自 Edx 课程 CS50 的问题集 2。所以 cs50.h 是课程中提供的头文件,它为我们提供了像 string 这样的特殊类型和像 GetString().

这样的独特功能

发生这种情况是因为您检查 space 不正确。应该这样做:

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

比较 strcmp(&name[i - 1], blank_space) 仅当从 i-1 开始的 name 的整个后缀匹配 blank_space 时才有效,这是一个具有单个 space 字符的字符串在里面。这仅可能出现在以 space 字符结尾的字符串末尾,因此它不适用于您的输入。

您可能要查找的内容:

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) 并且 returns 为零。

你所做的是将 Koh</code> 进行比较,这显然不相等。 </p> <p>你应该搜索space喜欢</p> <pre><code>if(name[i - 1] == ' ') { \space found }

对您的程序来说,侵入性较小的更改(还有很多要讨论的地方)是将 strcmp 更改为 strncmp 。因为strcmp比较等长的字符串是相等的。使用 strcmp 永远不会发生,因为第一个参数字符串总是比第二个 (space) 长。由于您的循环永远不会找到 space,因此只会打印第一个字母。

变化:

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

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

如果要比较子字符串或

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

如果你想比较单个字母。