返回名称缩写的C程序(CS50)

时间:2015-12-28 16:15:30

标签: c string memory char 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 = 0name[-1]存储的值是否可能是字母字符?

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

3 个答案:

答案 0 :(得分:5)

对于i = 0name[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