【问题标题】:I made a code but I don't know why it doesn't work我做了一个代码,但我不知道为什么它不起作用
【发布时间】:2022-01-22 17:54:30
【问题描述】:

我编写了一个代码,但由于某些原因,当我编译它时,我可以输入字符串,但编译器会中断。

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

main(){
    char s1[100]={};
    char s2[100]={};
    gets(s1);
    gets(s2);
    int zbr;
    funkcija(s1[100], s2[100], &zbr);
    printf("Zbroj duljina stringova je: %d", zbr);
}

void funkcija(char x1[100],char x2[100], int *pzbr){
    int n1=0, n2=0;
    n1=strlen(x1);
    n2=strlen(x2);
    *pzbr=n1+n2;
}

在输入字符串后,它表示程序已停止工作,Windows 正在尝试修复它,就像您在 scanf 中输入地址时一样。

【问题讨论】:

  • 当你调用funkcija函数并传递s1[100]时,s1[100]这个表达式真的在做什么?尝试向您的rubber duck 解释。还有一些其他问题表明您需要退后一步,投资几本书并从头开始阅读。
  • 欢迎来到 SO。您应该打开编译器警告。在您的函数调用中,s1[100] 是该数组的单个元素。它也是最后一个元素的后面。两者(越界访问数组并将错误的参数类型传递给您的函数)都会导致未定义的行为
  • 无关:从不使用gets。它甚至从 C11 的语言中删除。
  • 另外,永远不会使用gets 它是如此的dangerous,它自1990年代以来就已经过时了,并在十年前在 C11 标准中完全删除。
  • 感谢您的建议和帮助。

标签: c string function pointers


【解决方案1】:
  • 自 1999 年以来,main() 在托管系统中是一种无效形式的 main()。请改用 int main (void)
  • char s1[100]={}; 是无效的 C,您需要至少输入一个初始化器,例如 { 0 },或者让数组保持未初始化状态。
  • s1[100] 是无效的 C 调用函数,您传递的是单个元素(并越界访问数组)。这应该是funkcija(s1, s2, &amp;zbr);
  • gets 已于 2011 年从 C 语言中删除,无法使用。研究如何改用fgets

【讨论】:

  • 现在在 highscool 中我被教导使用 get 所以这有帮助。
  • @Nuke 不幸的是,这意味着你的老师非常不称职,不应该教 C。gets 在 1990 年代中期被标记为危险和过时,最终在 10 年前完全从语言中删除.
  • 我其实问过他为什么不用它,他解释了,所以没问题。他是一位伟大的老师,但他只需要通过课程来做到这一点。
猜你喜欢
  • 1970-01-01
  • 2020-09-19
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 2019-05-21
  • 1970-01-01
  • 2019-03-13
相关资源
最近更新 更多