我有一个简单的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}}等唯一函数。
答案 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 )
如果你想比较单个字母。