这是我的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()
函数返回用户输入的字符串。
答案 0 :(得分:5)
对于i = 0
,name[i-1]
正在访问未分配的内存,这将导致未定义的行为。将循环计数器更改为i = 1
而不是i = 0
。
如评论中所述,您需要检查循环外i =0
的条件。
答案 1 :(得分:3)
假设为PrintSettings settings = new PrintSettings();
settings.PaperSize = new PaperSize("XXX", "XXX", 500, 5000);
PageSetup setup = new PageSetup();
setup.SetBottomMargin(0, Unit.Pixel);
setup.SetTopMargin(0, Unit.Pixel);
setup.SetLeftMargin(0, Unit.Pixel);
setup.SetRightMargin(0, Unit.Pixel);
setup.PaperSize = settings.PaperSize;
PrintOperation print = new PrintOperation();
print.DefaultPageSetup = setup;
print.PrintSettings = settings;
print.BeginPrint += new BeginPrintHandler(OnBeginPrint);
print.DrawPage += new DrawPageHandler(OnDrawPage);
print.EndPrint += new EndPrintHandler(OnEndPrint);
print.Run(PrintOperationAction.Print, null);
指定的字符串分配并由name
指向的内存从name[0]
开始,那么name[i-1]
将在i=0
时引起越界数组访问,是C中未定义的行为,可能会导致程序中出现各种奇怪的症状(包括它正常工作:-)。这是一个不幸的案例,通过了所有测试,因为它误导了你。
答案 2 :(得分:2)
实际上在C中,[]
运算符可以替换为*()
。
a[n]
等于*(a+n)
; 因此,在您的情况下,i = 0
,当您的字符串从*(a - 1)
开始到a
时,您正在访问a + length
位置。所以,这会导致未知的行为。
+----+----+----+----+
| f | o | o | \0 |
+----+----+----+----+
^ ^
| |
a a + 3