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

时间:2015-02-14 09:55:37

标签: 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 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)为什么1返回name[i - 1]的值,即使在blank_space是空格的情况下也是如此,在执行此操作时,它应该与strcmp变量的结果相同printf。当我用cs50.h打印出它们时,它们看起来都一样!

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

仅供参考:这实际上来自Edx课程CS50的问题集2。因此,string是在课程期间提供的标题文件,它为我们提供了GetString()等特殊类型以及{{1}}等唯一函数。

4 个答案:

答案 0 :(得分:3)

这是因为您正在检查错误的空间。它应该这样做:

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

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

答案 1 :(得分:2)

这里你可能正在寻找:

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");

答案 2 :(得分:2)

strcmp比较两个字符串直到null(\ 0)找到两个字符串并返回零。

您正在做的是将Koh进行比较,这显然是不相等的。

您应该搜索

之类的空间
if(name[i - 1] == ' ')
{
   \\space found
}

答案 3 :(得分:2)

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

变化:

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

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

如果你想比较子串或

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

如果你想比较单个字母。