【问题标题】:CS50 pset2, get initials of a nameCS50 pset2,获取姓名的首字母
【发布时间】:2015-11-01 11:45:45
【问题描述】:

我在下面的代码中遇到分段错误。

char name[30];
char initials[10];
int i=0, j=0;
int size;

printf("Getting name: ");
name = Getstring();
size = strlen(name);

while(i < size)
{
    if(i == 0)
    {
         initials[j] = toupper(name[i]);
         j++;
    }
    else
    {
         if(name[i - 1] == ' ')
         {
              initials[j] = toupper(name[i]);
              j++;
         }
    }
    i++;
}
initials[j] = '\0';
printf("%s",initials);
    }
}

当我调试它时(通过 cs50 设备中的 gdb),我发现了这个语句中的错误: 首字母[j] = toupper(姓名[i]);

这里有什么想法吗?请帮忙.. :(

【问题讨论】:

    标签: c segmentation-fault cs50


    【解决方案1】:

    您的代码中至少有 2 个问题:

    1. name 赋值:name = Getstring();
      name 是一个字符 array,你不能像使用例如一个int。您应该使用strcpy() 之类的东西将新字符串复制到其中。这样,name 将保存一个有意义的字符串,您可以在其上使用strlen()
    2. 字符分配:initials[j] = toupper(name[i]);
      我知道您假设 name 的首字母不能超过 10(因此,j 可能总是 &lt; 10。但是,您应该始终考虑极端情况,以保护您的程序免受(邪恶的)用户输入。尝试在循环中使用此条件:while(i &lt; size &amp;&amp; j &lt; 10)

    【讨论】:

    • 嘿Jongware。谢谢。但在尝试上述代码之前,我尝试将名称声明为字符串数据类型(CS50 设备的 1 个头文件中可用的字符串类型)。其余代码完全相同。我也得到了同样的东西。
    猜你喜欢
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2015-12-17
    相关资源
    最近更新 更多