c - 为什么程序在 scanf 上停止...如果删除该行它可以正常工作

标签 c string pointers literals

int main() {
    char *name;
    int howMany, i;

    printf("how many character do you want to enter: ");
    scanf(" %d", &howMany);     /*why does it stop here */
    name = (char *)malloc(5 * sizeof(char));
    printf("enter characters ");
    gets(name);
    puts(name);
    return 0;
}

最佳答案

你的程序有问题:

  • 你应该检查 scanf() 的返回值;
  • 您不应使用过时且不安全的函数 gets() ;
  • 您应该分配 howMany + 1 字节而不是 5。额外的字节用于空终止符;
  • 你应该检查 malloc() 的返回值;
  • gets() 读取输入流中剩余的未决换行符 scanf() 并停止。观察到的行为可能是这样的:

    • 系统会提示您输入*您要输入多少个字符:*
    • 你输入一个数字后跟一个换行符
    • 程序立即退出

修改后的版本:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *name;
    int howMany, i, c;

    printf("how many character do you want to enter: ");
    if (scanf(" %d", &howMany) == 1) {
        /* read the remainder of the line, including the newline character */
        while ((c = getchar()) != EOF && c != '\n')
            continue;
        if (howMany <= 0) {
            printf("invalid number: %d\n, howMany);
            return 1;
        }
        name = malloc(howMany + 1);
        if (name == NULL) {
            printf("cannot allocate %d bytes\n, howMany + 1);
            return 1;
        }
        printf("enter characters ");
        for (i = 0; i < howMany; i++) {
            if ((c = getchar()) == EOF)
                break;
            name[i] = c;
        }
        name[i] = '\0';
        puts(name);
    }
    return 0;
}

关于c - 为什么程序在 scanf 上停止...如果删除该行它可以正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41919553/

相关文章:

c++ - 无法使用指针访问类函数

c - 该程序中将二进制数转换为十进制数的 for 循环背后的逻辑是什么

string - 给定一个由 0 和 1 组成的循环字符串,求最小值。将所有 1 放在一起的相邻交换

c++ - 什么是 glibc free/malloc/realloc invalid next size/invalid pointer error 以及如何修复它?

c# - dynamic.ToString() 意外行为

在 C 中将字符转换为字符串

c++ - 传递指针 vector 的指针......不不?

c++ - 为什么要使用指针而不是对象本身?

c - 提高缓存命中率

c - connect() 怎么会失败并将 errno 设置为 EADDRINUSE