c - 输入姓名并输出姓氏和名字的首字母

标签 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

出了什么问题?

最佳答案

toupper() 函数不返回字符串,并且 c 中没有这种类型,您必须转换每个字符,因此像这样转换第一个字符

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

请注意,任何高级语言内部发生的情况都是如此,每个字符都是单独转换的。

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

更重要的是,使用定义为 char *string 类型非常具有误导性,你隐藏了许多 C 程序员必须小心的重要事情

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

关于c - 输入姓名并输出姓氏和名字的首字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42117085/

相关文章:

c - 安装C库后"cc1: error:/usr/local/include: not a directory"

c - KERN_INVALID_ADDRESS 让我难住了

CS50 Pset2。维杰内尔。上文本到下键,反之亦然问题

python - 在 Cython 中迭代字节/unicode 字符串的最佳方法

c - scanf 之后 fgets 不起作用

c - 作为 printf 占位符的 %0.2lf 和 %.2lf 有什么区别?

无法定义变量

c - While 循环带我去兜风(C 语言)!

c - 如何从动态字符串中删除换行符

c++ - 为RealBasic创建与C/C++库的绑定(bind)