【问题标题】:Checking number of not empty strings in array of structure; assign NULL value to array of char in array of structure检查结构数组中非空字符串的数量;将 NULL 值分配给结构数组中的 char 数组
【发布时间】:2014-02-10 09:05:08
【问题描述】:

函数应该在结构数组中返回一些非空字符串。输入值后,程序停止工作。
第二个问题:如何将空值分配给 Lancuch 结构数组中的一个 L 元素?

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

typedef struct{
    char L[100];
} Lancuch;

int funkcja5 (Lancuch[], int);

int main()
{
    Lancuch st[3];
    scanf("%s",&st[0].L);
    scanf("%s",&st[1].L);
    scanf("%s",&st[2].L);
    printf("%s\n",funkcja5(st,3));
    return 0;
}

int funkcja5 (Lancuch s[], int n)
{
    int i = 0, suma = 0;
    for(;i<n;i++)
    {
        if(strlen(s[i].L) > 0)
        {
            suma++;
        }
    }
    return suma;
}

【问题讨论】:

  • 您是否使用调试器来定位错误?
  • @tristan:有很多错误,但崩溃可能在这里printf("%s\n",funkcja5(st,3));。一切尽在我的回答中。

标签: c arrays function struct char


【解决方案1】:

这可能就是你看到的崩溃。

printf("%s\n",funkcja5(st,3));

funkcja 返回一个 int,但您使用了格式说明符 "%s"。应该是"%d"

还有以下表达式:

&st[0].L

导致char (*)[100],即指向char[100] 数组的指针,而不是scanf 期望的指向char 的指针。数组不是指针,获取数组的地址会产生指向数组的指针。这有时似乎有效,但您正在调用未定义的行为。

您想要的是将数组降级为指向其第一个元素的指针,所以...

scanf("%s",st[0].L);
/* and so on... */

当然,您仍然可以在此处出现缓冲区溢出。 scanf不能安全使用;改用fgets

if(fgets(st[0].L, sizeof st[0].L, stdin)) {
    // successfully read
}

至于给数组“赋值”一个空值,你不能;数组不可赋值。您可以通过简单地将第一个元素设为空终止符来将它们设为空字符串:

std[0].L[0] = '\0';

但是,数组永远不能为空。看来您混淆了数组和指针。

顺便说一句,提高你的警告级别。由于格式字符串和输入类型之间的不兼容,您应该在那些 scanf 调用中遇到错误。

【讨论】:

  • 当我将行更改为scanf("%s",st[0].L); 时,我仍然收到来自 Windows 的通知“程序停止工作”i.imgur.com/MGenOBe.png 但是,之前有“进程退出,返回值 3221225477”,现在是“.. . 255"
  • 哦,我没注意到错误的格式说明符。感谢您的帮助!
  • @user3135351:没问题,但通常你会选择这个作为正确答案。
猜你喜欢
  • 1970-01-01
  • 2017-06-12
  • 2015-09-25
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 2015-10-26
  • 2011-05-24
  • 1970-01-01
相关资源
最近更新 更多