输入姓名并输出姓氏的第一个姓名和名字

时间:2017-02-08 15:24:35

标签: c cs50

我通过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

出了什么问题?

1 个答案:

答案 0 :(得分:0)

toupper()函数不会返回字符串并且c中没有这样的类型,你必须转换每个字符,所以像这样转换第一个字符

a[0] = toupper(a[0]);
return a;

请注意,任何更高级别语言内部发生的事情都是这样,每个字符都是单独转换的。

另请注意,您正在修改传递给函数的同一对象,因此main()中的变量也将被修改。

更重要的是,使用定义为string的{​​{1}}类型是非常误导的,你隐藏了很多重要的事情,程序员必须小心使用

  1. 类型char *的变量是指针。
  2. 字符串实际上是以string结尾的字符数组,这就是为什么我像我一样编写'\0'循环。
  3. 通过定义这样的类型,程序员可能会推断使用+运算符可以连接字符串,这只会导致所谓的未定义行为。