在打印出首字母的 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 )
如果你想比较单个字母。
我有一个简单的 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 )
如果你想比较单个字母。