【问题标题】:Last letter is input + 1 for some reason由于某种原因,最后一个字母输入+ 1
【发布时间】:2020-03-04 06:32:10
【问题描述】:

我正在做一个练习,打印来自用户的 3 个字母。前两个字母很好,但最后一个字母总是出现在用户出于某种原因输入之后的字母(我尝试了几种不同的输入组合,结果总是相同):

#include <stdio.h>

int main(){

    char userChar[3];
    int i;

    for (i = 1; i <= 3; i++){
        printf("Enter letter %d\n", i);
        scanf(" %c", &userChar[i]);
    }

    printf("%c %c %c", userChar[1], userChar[2], userChar[3]);

    return 0;
}

输入是:abc 输出为:abd

我搞砸了什么?感谢您的帮助!

编辑进行了建议的更改,但仍然无效

【问题讨论】:

  • C 中的数组基于0。 IE。第一个元素是userChar[0],最后一个元素是userChar[2]。
  • 所以userChar[3] 打破了数组界限,结果可能是任何结果——从错误答案到崩溃。
  • for (i = 0; i &lt; 3; i++) 然后userChar[0], userChar[1], userChar[2]
  • 重新更新:您将数组长度从 char userChar[3]; 更改为 char userChar[2];
  • 好吧,我怀疑它......它是从零开始的索引,而不是长度。保留它3。

标签: c arrays for-loop char scanf


【解决方案1】:

我会发布这个作为答案,只是为了澄清修改

#include <stdio.h>

int main(){

    char userChar[3];
    int i;

    for (i = 0; i < 3; i++){                                    // the loop range
        printf("Enter letter %d\n", i + 1);                     // for human use
        scanf(" %c", &userChar[i]);
    }
    printf("%c %c %c", userChar[0], userChar[1], userChar[2]);  // the array indexing

    return 0;
}

节目环节

Enter letter 1
a
Enter letter 2
b
Enter letter 3
c
a b c

【讨论】:

  • 太棒了,谢谢!当我将数组大小从 2 更改为 3 时它起作用了,这只是在数组中留下额外空间的一般经验法则吗?
  • 这不是额外的!当您定义 char userChar[3]; 时,它是 三个 元素的数组。不要将大小与索引混淆。三个元素的数组以0 到2 为索引。
猜你喜欢
  • 2019-07-29
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多