我是C语言的新手,我正在尝试做一个练习,要求插入一些字符串然后存储它们。首先,它请求一个多维数组,其中数组的每一行都有一个字符串,然后是指针数组。这是第一部分的代码。我不知道如何将一些尚未写入的字符串存储到数组中。
对于第二个我不知道,因为我以前从未做过指针练习。
#include <stdio.h>
int main(){
int n; //number of strings
int x; //number of characters per string
printf("How many strings do you want to insert?");
scanf("%d", &n);
if ((n >= 1) && (n <= 20)){
printf("How many characters per string?");
scanf("%d", &x);
char str[x];
if (x <= 10){
for(int i = 0; i < n; i++){
printf("Insert a string:");
scanf("%s", str);
for(int j = 0; j < x; j++){
char arr[j];
arr[j] = str[x];
printf("%s", arr);
}
}
}
else {
printf("Error:the number of characters must be < 10");
}
}
else {
printf("Error: the number must be < 20");
}
return 0;
}
...请求一个多维数组,其中数组的每一行都有一个字符串,然后是指针数组。
获得合格的字符串数后,分配一个指向char
的指针的数组。
if ((n >= 1) && (n <= 20)){
char **string_list = calloc(n, sizeof *string_list);
assert(string_list); // or other error checking
((请注意= calloc(n, sizeof *string_list);
中没有类型。更容易编码,检查和维护。)
读取正在工作的临时缓冲区中的字符串。如“每个字符串多少个字符?”可能意味着字符数[[not包括null character,我们的str[]
的大小需要为+1。
// char str[x]; // too small
char str[x+1];
但是我们知道x <= 10
,并且可以使用固定的缓冲区大小和限制输入长度
for(int i = 0; i < n; i++){ char str[10+1]; printf("Insert a string:"); scanf("%10s", str); // Notice the 10 - a width limit // TBD check if scanf() returned 1 and if str is longer than x
现在分配str
的副本
string_list[j] = strdup(str); assert(string_list[j]); // or other error checking }
稍后,用string_list[]
,clean-up和自由分配完成。
for (int i=0; i<n; i++) { free(string_list[i]); } free(string_list);
,不处理超长输入,
这有什么缺点:它使用
scanf()
而不是fgets()
,然后进行分析,具有最少的错误检查,不使用空格插入strings
strdup()
is not standard -yet等所以以上是一个小步骤。更好的代码可以解决这些薄弱的问题。