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 = 0
,name[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
这是我的 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 = 0
,name[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