我通过 edx.org 报名参加了哈佛大学的 cs50,我陷入了第二个问题,该问题要求我们创建一个程序,该程序接受人们的姓名并给出他们的名字和姓氏的首字母缩写。代码在这里:
string initial (string a);
int main (void)
{
printf("Give me your name\n: ");
string name = GetString();
printf("Give me your second name\n:");
string sname = GetString();
char*c; char*b;
c = name;
b = sname;
printf("%s %s\n", initial(c),initial(b));
}
string initial (char*a)
{
if ( *a >= 'A' && *a <= 'z')
{
return toupper(*a);
else
return ("please retype your name");
}
}
这是我从编译器收到的错误消息。
initials.c:27:16: error: incompatible integer to pointer conversion returning 'int' from a function with result type
'string' (aka 'char *') [-Werror,-Wint-conversion]
return toupper(*a);
^~~~~~~~~~~
initials.c:29:9: error: expected expression
else
^
2 errors generated.
make: *** [initials] Error 1
出了什么问题?
最佳答案
toupper()
函数不返回字符串,并且 c 中没有这种类型,您必须转换每个字符,因此像这样转换第一个字符
a[0] = toupper(a[0]);
return a;
请注意,任何高级语言内部发生的情况都是如此,每个字符都是单独转换的。
另请注意,您正在修改传递给函数的同一对象,因此 main()
中的变量也会被修改。
更重要的是,使用定义为 char *
的 string
类型非常具有误导性,你隐藏了许多 C 程序员必须小心的重要事情
string
类型的变量是指针。- 字符串实际上是一个以
'\0'
结尾的字符数组,这就是为什么我像以前一样编写了for
循环。 - 通过定义此类类型,程序员可能会推断可以使用 + 运算符连接字符串,但这只会导致所谓的未定义行为。
关于c - 输入姓名并输出姓氏和名字的首字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42117085/