returns姓名首字母的C程序(CS50)

C program that returns the initials of a name (CS50)

这是我的 main

char* name = GetString();
if(name != NULL)
{
    for(int i = 0, j = strlen(name); i < j; i++)
    {
        if(!isalpha(name[i-1]) && isalpha(name[i]))
            printf("%c", toupper(name[i]));
    }
    printf("\n");
}

程序运行良好;它通过了所有 (check50) 测试。

但我担心一个可能的错误,那就是 i = 0 中存储的值是否可以是字母字符 name[-1]

注:GetString()函数returns用户输入的字符串。

对于 i = 0name[i-1] 正在访问未分配的内存,这将导致未定义的行为。将循环计数器更改为 i = 1 而不是 i = 0

如评论中所述,您需要在循环外检查 i =0 的条件。

假设name分配给字符串的内存从name[0]开始,那么name[i-1]会在i=0时导致数组越界访问,这是 C 中的未定义行为,可能会导致您的程序出现各种奇怪的症状(包括它正常工作 :-)。这是一个不幸的案例,它通过了所有测试,因为它误导了你。

其实在C中,[]运算符可以用*()代替。

  • a[n] 等于 *(a+n);

因此,在您的情况下,当 i = 0 时,您正在访问 *(a - 1) 位置,而您的字符串从 a 开始到 a + length。因此,这会导致未知行为。

+----+----+----+----+
| f  |  o | o  | [=10=] |
+----+----+----+----+
  ^              ^
  |              |
  a            a + 3