我正在嘗試閱讀以下型別的輸入
2
string1
string2
其中第一行表示下面的字串數量,并且字串的長度都(一些)相同。接下來,我想在我的程式中列印這些字串,我想這樣做如下。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void print_string_array(char** a, int size){
for (int i=0; i<size; i ){
printf("%s\n", a[i]);
}
}
int main()
{
int n;
scanf("%d", &n);
char* s;
scanf("%s", s);
int l = strlen(s);
char input[n][l];
strcpy(s, input[0]);
for (int i = 1; i < n; i ) {
scanf("%s", s);
strcpy(s, input[i]);
}
print_string_array(input, n);
}
但我收到以下警告和錯誤。
main.c: In function ‘main’:
main.c:24:24: warning: passing argument 1 of ‘print_string_array’ from incompatible pointer type [-Wincompatible-pointer-types]
24 | print_string_array(input, n);
| ^~~~~
| |
| char (*)[(sizetype)(l)]
main.c:5:32: note: expected ‘char **’ but argument is of type ‘char (*)[(sizetype)(l)]’
5 | void print_string_array(char** a, int size){
| ~~~~~~~^
Segmentation fault (core dumped)
為什么我的陣列沒有input
被識別為一種char**
型別?在不洗掉當前程式的一般屬性(例如,對任何長度的輸入字串的適應性)的情況下,我將如何解決這個問題?
編輯:
我已經糾正了多年來沒有用 C 編碼的一些錯誤(這可能是我在評論中看到的戰爭罪):
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void print_string_array(char** a, int size){
for (int i=0; i<size; i ){
printf("%s\n", a[i]);
}
}
int main(){
int n;
scanf("%d", &n);
char s[100]; // large enough buffer
scanf("%s", s);
int l = strlen(s);
char input[n][l 1]; // 1 to leave room for ‘\0’ character?
strcpy(input[0], s);
for (int i=1; i<n; i ){
scanf("%s", input[i]);
}
print_string_array(input, n);
for (int i=0; i<n; i ){
free(input[i]);
}
free(input);
}
但我仍然收到一些我想解決的錯誤和警告。
main.c: In function ‘main’:
main.c:22:24: warning: passing argument 1 of ‘print_string_array’ from incompatible pointer type [-Wincompatible-pointer-types]
22 | print_string_array(input, n);
| ^~~~~
| |
| char (*)[(sizetype)(n)]
main.c:5:32: note: expected ‘char **’ but argument is of type ‘char (*)[(sizetype)(n)]’
5 | void print_string_array(char** a, int size){
| ~~~~~~~^
Segmentation fault (core dumped)
從警告開始,顯然我將a
from的型別更改char**
為其他內容。但是,我真的應該給它型別char (*)[(sizetype)(n)]
嗎?此外,segmentaion fault
在 for 回圈中的某處發生了問題。
uj5u.com熱心網友回復:
除了評論中解釋的代碼中的問題。
input
是 a char*
,它指向記憶體中的陣列,該陣列的大小n*l
而不是 a char**
,它是指向 a 的指標char*
。
您需要分配一個陣列,char*[]
然后將char*
您從中獲得的每個指標添加scanf
到該陣列。
uj5u.com熱心網友回復:
可變長度陣列
下一篇:ORM增刪改查并發性能測驗2input[n][l 1]
不需要被釋放。
該input[n][l 1]
陣列不是指向指標的指標**a
。記憶體排列存在差異,它們不兼容。
void print_string_array( int size, int len, char (*a)[len]){
為編譯器提供 VLA 的維度,以便函式可以正確訪問它。
scanf("