在打印出首字母的C程序中不理解的行为
我有一个简单的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
#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 )