C语言输入及传参之谜 —— 数组篇

前言

最近有点忙碌,毕设和找工作同步进行,需要进行一些算法的训练,leetcode 上面风格是只用写函数体的内容,基本不用考虑输入时什么样的,但是基本上公司都是用牛客网作为笔试和面试的平台,牛客上的程序是完整的。。。从头到尾要全部写出来,这个时候,就会发现各种读取输入并存储的问题,然后是各种传参的问题(毕竟 leetcode 上都已经把这些参数接口啥的形式都给出来了,我们直接用就行),这是第二个大坑,代码逻辑都写完了,然后发现输入的数组啥的并没有传入子函数,抓狂!所以用一篇博文记录一下最近遇到的各种自己之前不熟悉的输入和传参问题

输入相关

由于一般的笔试题都有多行的输入,所以需要进行循环输入,并且有时候还没有初始条件来判断总共的行数,下面用一些典型的例子来说明

字符串数组的输入记录

这里分两种情况

  • 前面已经定义好了数组的大小

这种情况比较简单,直接一个 for 循环就可以完美地将所有的内容输入

1
2
3
4
5
6
char* str; 
//注意这里如果是定义的字符指针,
//那么 scanf 里面的引用是不用加 & 符号的,因为这时 str 已经是一个地址?
for(int i=0;i<counter;i++){
scanf("%s",str);
}
  • 前面未定义数组大小

这种情况需要用 while 循环来进行输入,但是输入结束的判断条件是什么?我实际上没有解决这个问题
推荐的读入方式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
int count=0;
char* recieve[nums];
//这里一定要注意的问题就是一定要记得给这个指针数组分配空间
for(int i=0;i<nums;i++){
recieve[i] = (char*)malloc(100*sizeof(char));
}
//当输入是文件的时候这种方案才有效,否则如果是在终端进行键入
//会出现一种按 enter 键无效的尴尬境地,因为在 %s 输入的时候
//包括空格和 enter 键都不认为是输入的结束标志,那什么是字符
//串输入的==结束标志呢?==
while(scanf("%s",str) != EOF){
recieve[count++] = str;
}

二维数组的输入记录

这里同样分两种情况

  • 前面已经定义好了数组的大小
    这种情况比较简单,不再赘述
  • 前面没有定义数组的大小
    这种情况同样需要 while 循环来进行输入,但是结束的标志为?

传参形式

自己写完整的程序不仅仅在输入的部分比较麻烦,而且还有一点就是在传参的时候也相对情况比较多一点,这里要注意的事情就是根据原始定义方式的不同,最后传入参数的值也相应地不同

字符串数组传参

字符数组一般是用指针的形式进行定义,因此,在作为参数传递的时候需要如下形式

1
2
3
4
//定义
char* arrays[];
//传参引用,这里一定是 char**,因为什么?
void a(char** arrays){}

二维数组传参

二维数组定义形式较多,对于各种不同的定义形式,最后传参的方式也不同

  • int a[m][n] 形式定义
    这种定义形式,需要的传参方式为
1
void a(int m,int n,int a[m][n])
  • int (a)[n] 形式定义
    这种定义形式,一定要注意
    a 的括号!因为 [] 运算符的优先级高于 *,所以这里表示的含义是 有 n 个指针的数组,然后指针又指向一个数组的首地址,这种定义形式,需要传参方式为
1
void a(int n,int (*a)[n])

注意:这里两种形式的传参中都预先申明了 m 和 n 的值,只有这样,这个数组才能够在栈上进行初始化的操作

参考链接

C语言:定义指向二维数组的指针变量
https://blog.csdn.net/linwh8/article/details/50346749
C语言字符串和字符串数组的输入赋值
https://blog.csdn.net/hl156/article/details/82856139

0%