【问题标题】:Char parameter in function is null or empty in C函数中的char参数在C中为null或为空
【发布时间】:2021-07-24 05:05:41
【问题描述】:

我目前正在学习c,然后我在玩函数和数据类型,特别是在本例中char[]

我编写的以下代码声明了一个名为 verifyMessage() 的函数并接收两个参数,namegender

当我执行该函数时,我传递了用户通过控制台输入的两个参数,但是当我打印name 时它什么也不打印。

#include <stdio.h>

int main() {
    int i = 0;
    double controlNumber = 21200164;
    double number = 0;
    char name[50];
    char gender[1];
    int attempts = 5;
    int aux = 0;

    do {
        printf("Introduzca el numero de control: ");
        scanf("%lf", &number);
        if (controlNumber == number) {
            printf("\nWrite your name: ");
            scanf("%s", name);
            printf("\nWrite your gender (M/F): ");
            scanf("%s", gender);
            verifyMessage(name, gender);
            break;
        } else {
            i++;
        }
    } while (i < attempts);

    return 0;
}

void verifyMessage(char name[50], char gender[1]) {
    if ('M' == gender[0]) {
        printf("\n\Name: %s", name);//Here doesn´t print the name
        printf("\nMen");
    } else if ('F' == gender[0]) {
         printf("\nWoman");
    } else {
        printf("\nInvalid gender");
    }
}

【问题讨论】:

  • 长度为 1 的数组有点毫无意义。甚至不要打扰。
  • char gender[1]; 至少需要为 char gender[2];。 C 中的字符串有一个 NUL 终止符。因此,单个字母字符串需要存储两个字符。您当前有缓冲区溢出,因此存在未定义的行为。
  • 另一种方法是使用char gender; 而不是数组。
  • @Barmar ... 和 scanf(" %c", &amp;gender); 而不是 scanf("%s", gender);
  • @MikeCAT 我把它留给学生作为练习......

标签: c function char scanf do-while


【解决方案1】:

char gender[1];%s 一起使用很危险,因为gender 只能容纳一个元素,因此它只能接受不超过零个字符的字符串(唯一的空间将被终止空字符占用)

另一方面,%s 将读取正长度字符串(它无法读取零字符的字符串),因此在成功读取时会导致超出范围的访问。

分配足够的元素并设置要读取的最大长度(最多为元素的数量减一以终止空字符)以避免缓冲区溢出。

char name[50];
char gender[2];

/* ... */

printf("\nWrite your name: ");
scanf("%49s", name);
printf("\nWrite your gender (M/F): ");
scanf("%1s", gender);

检查scanf() 的结果(返回值)以检查他们是否成功读取所需内容将进一步改进您的代码。

【讨论】:

  • 感谢您的帮助,我完全忘记了charc 中的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2015-09-26
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
相关资源
最近更新 更多