【问题标题】:Strings are not printed in accordance with the way they are allocated字符串不是按照分配方式打印的
【发布时间】:2015-01-31 03:19:12
【问题描述】:

在下面的代码中,我的第一个输出返回了我的第二个字符串和我的第三个字符串。

#include <stdio.h>

int bandNumber;
char colorOne[];
char colorTwo[];
char colorThree[];

int main(void) {
    printf("How many bands??\n");
    scanf("%d",&bandNumber);
    if(bandNumber == 3) {
        printf("\n\nEnter your first band color: ");
        scanf("%s",colorOne);
        printf("\n\nEnter your second band color: ");
        scanf("%s",colorTwo);
        printf("\n\nEnter your third band color: ");
        scanf("%s",colorThree);
        printf("\n\nBand One: %s",colorOne);
        printf("\n\nBand Two: %s",colorTwo);
        printf("\n\nBand Three: %s\n\n",colorThree);
    }
}

谁能解释这些错误以及我可以做些什么来纠正它们?

【问题讨论】:

  • char colorOne[];。你确定你的代码编译没有错误吗?
  • 编译器显示警告。有什么更好的方法来声明一个没有限制的字符串?
  • 代码不能“无限制地声明一个字符串”。代码可以声明一个指向char的指针。

标签: c string


【解决方案1】:

未检测到错误,因为编译器的警告未启用、被忽略或需要更好的编译器。此代码不为正在读取的数据分配空间。

最简单的解决方案:使用固定大小的数组并限制用户输入。

#include <stdio.h>

int main(void) {
    char colorOne[80+1];
    printf("How many bands??\n");
    ...
    printf("\n\nEnter your first band color: ");
    if (1 != scanf("%80s", colorOne)) Handle_EOForIOError();
    ...
    printf("\n\nBand One: %s",colorOne);
}

更强大的解决方案是使用fgets()。如果操作系统支持getline(),请考虑。

int main(void) {
    char colorOne[80+1+1];
    printf("How many bands??\n");
    ...
    printf("\n\nEnter your first band color: ");
    if (fgets(colorOne, sizeof colorOne, stdin) == NULL) Handle_EOForIOError();

    // Delete potential ending \n
    size_t len = strlen(colorOne);
    if (len > 0 && colorOne[len-1] == '\n') colorOne[--len] = 0;
    ...
    printf("\n\nBand One: %s",colorOne);
}

练习defensive coding

【讨论】:

    【解决方案2】:
    char colorOne[];
    

    没有大小的数组只能和这个声明一起使用

    char colorOne[] = "someString";
    

    Else char 数组colorone 无法计算数组的大小并存储您扫描的字符串。所以这应该有初始化程序。

    否则你可以像 VLA(从 C99 支持)

    int N;
    scanf("%d",&N);
    char colorOne[N];
    

    而且总是有动态内存分配

    char *colorOne = malloc(sizeof(char) * N);
    

    【讨论】:

    • 这是一个有效的声明,即使不是定义。链接器应该抱怨缺少符号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2023-04-02
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多