我正在尝试创建一个程序,它采用名称并输出首字母但仍然遇到数组错误

时间:2016-10-05 23:50:12

标签: c arrays cs50

我正在尝试创建一个程序,该程序从用户那里获取输入并打印每个单词的第一个字符,但每次我尝试这里都是我的代码。

 #include <stdio.h>
 #include <cs50.h>
 #include <string.h>

int main(void)
{
    char leng[100];
    int len;
    scanf("%s", &leng[100]);
    len = strlen(&leng[100]);
    char name[len];
    //checking if at end or not
    while (name[len] != '\0')
    {
        if (name[len] == ' ')
            printf("%c", name[len + 1]);
        len++;
    }
}

每当我给出一个名字时,它会显示如下错误:

index 3 out of bounds for type 'char [len]'

2 个答案:

答案 0 :(得分:2)

这两行不正确:

scanf("%s", &leng[100]);
len = strlen(&leng[100]);

如果你将这些翻译成英文,它们的含义是:

  • 将字符串扫描到内存中第101个元素的地址 冷阵。
  • 获取从地址开始的字符串的长度 leng数组的第101个元素。

数组索引超出范围,因为leng [100]超出了数组的末尾。请记住,100元素数组从0到99,而不是从1到100!

您希望扫描到数组的基址,并将数组的基址传递给strlen()。我将保留语法,让您从教科书中找出答案。

顺便说一句,你的代码也有问题,因为你正在将数据读入名为leng的数组中,但是你的循环正在使用名为len的数组。您的代码中至少还有两个问题,但我会让它们进行调试。

答案 1 :(得分:0)

您的代码需要考虑一些事项。正如@richardschwartz已经提到的那样,你没有正确引用你的char数组。你有:

scanf("%s", &leng[100]);
len = strlen(&leng[100]);

您可能需要以下内容:

scanf("%s", leng);
len = strlen(leng);

另外,请记住,一旦检测到空白区域,带有%s标志的scanf将停止读取输入。例如,如果您输入&#34; hello world&#34;,

scanf("%s", leng);

只会抓住角色&#34;你好&#34;。为了解决这个问题,你可以循环scanf来读取多个单词并根据需要返回每个单词的第一个字符。

最后,不建议初学者使用scanf。请参阅paxdiablo关于缺少溢出保护的优秀理由,例如:https://stackoverflow.com/a/1248017/6870832