【问题标题】:The second parameter in a function is always 0函数中的第二个参数始终为 0
【发布时间】:2022-01-06 21:01:13
【问题描述】:

基本上,我需要得到一个二维数组整行的总和或平均值。

首先我需要得到我需要使用的线,然后是“S”代表总和或“M”代表平均值(葡萄牙语中的 Média)。之后我需要读取整个数组,最后我只需要执行请求的操作。

double soma_linha_matriz(double matriz[LINHA][COLUNA], int l)
{
    int i;
    double soma;
    
    soma = 0;
    
    for(i = 0; i < COLUNA; i++)
    {
        soma = soma + matriz[l][i];
    }
    
    return soma;
}

由于某种原因,'l' 在这里总是为零,即使我在主函数中做了一个 scanf:


int main()
{
    double matriz[LINHA][COLUNA], resultado;
    
    int i, j, l;
    
    char sm;
    
    scanf("%d", &l);
    
    scanf("%s", &sm);
    
    for(i = 0; i < LINHA; i++)
    {
        for(j = 0; j < COLUNA; j++)
        {
            scanf("%lf", &matriz[i][j]);
        }
    }
    
    if(sm == 'S')
    {
        resultado = soma_linha_matriz(matriz, l);
        
        printf("%.1lf", resultado);
    }
    else if(sm == 'M')
    {
        resultado = media_linha_matriz(matriz, l);
        
        printf("%.1lf", resultado);
    }
    
    return 0;
}

我尝试了很长时间来纠正它,但我不知道为什么会发生这种情况......

有人可以帮忙吗?

【问题讨论】:

  • 这是什么语言?你能添加适当的标签吗?
  • @Phil 是 C。对不起,我是新来的,我想我会选择其他地方的语言。
  • scanf("%s", &amp;sm); 这是未定义的行为,"%c"char 的格式说明符,"%s" 用于字符串。
  • @yano 出于某种原因,这样做会导致程序立即关闭。这就是我使用“%s”的原因
  • 当您scanf("%d", &amp;l); 时,输入缓冲区中会留下一个换行符,随后会被scanf("%c", &amp;sm); 吞噬,并将换行符保存到sm。您可以在 "%c" 前面加上空格以跳过换行符:scanf(" %c", &amp;sm);。请参阅here 了解更多信息。

标签: c parameter-passing


【解决方案1】:

scanf("%s", &sm) 读取的是字符串,而不是字符。根据文档,它总是存储一个空终止符(除了匹配的字符之外,总是存储一个空字符(因此参数数组必须有空间至少容纳宽度+1 个字符) - https://en.cppreference.com/w/c/io/fscanf)和它将它存储到您的“l”变量中。

这种情况也是典型的堆栈溢出错误。

【讨论】:

  • 当我使用“%c”时,只要我给出一个字符,程序就会崩溃。我确实尝试在它前面放一个空格,现在它可以工作了,虽然我真的不知道为什么除了一些关于输入的东西。不过谢谢,它帮了很多忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 2015-12-17
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多