c - 字符串列表 - 确定我哪里出错了
问题描述
这是我需要在算法和数据结构中解决的问题的一部分,但我无法超越这一点。
第一步是加载一堆字符串并使用双指针将它们放入一个数组中。似乎很清楚。我的初始代码是:
int main (void){
char **A, a[50];
int n,i;
scanf("%d",&n);
A=malloc(n*sizeof(a));
for(i=0;i<n;i++){
fgets(a,sizeof(a),stdin);
a[sizeof(a)-1]='\0';
A[i]=a;
printf("%s",A[i]);
}
return 0;
}
由于在输入字符串数后我找不到消除第一个 '\n' 的方法,因此我的输入示例如下:
3布鲁斯
简
德韦恩
for 循环中的 printf 函数用于在我输入这些字符串并将它们放入数组后检查它们是否在它们的位置。看起来不错。
但是,只要我添加一个简单的 for 循环来再次检查内容(在返回 0 之前;)
for(i=0;i<n;i++){
printf("%s",A[i]);
}
只有姓氏被打印了三遍,这意味着其他人不在列表中(即使看起来他们是)。
我想知道是否有人能看到我哪里出错了,我真的很感激。
解决方案
A
是指向 的指针char *
,因此必须分配它来保存n
指针:
A = malloc(n * sizeof(*A));
在阅读之后,stdin
您必须以这种方式删除返回行:
a[strcspn(a, "\n")] = '\0';
然后 from 中的每个元素A
都应该指向一个内存,我们在该内存上复制输入:
A[i] = malloc(strlen(a) + 1);
最后更改此分配A[i]=a
,这将使
A
指向的所有元素a
,将字符串strncpy
复制到:a
A[i]
strncpy(A[i], a, strlen(a) + 1);
其他注意事项是,scanf
它将留在要读取\n
的缓冲区中,因此您必须在读取之前使用:fgets
\n
fgets
int c;
do {
c = getchar();
} while(c != '\n' && c != EOF);
并且不要忘记检查 和 的返回值scanf
是否fgets
存在错误情况:
if (scanf("%d",&n) != 1) {
fprintf(stderr, "Error while reading n\n");
return 1;
}
...
if (fgets(a,sizeof(a),stdin) != NULL) {
fprintf(stderr, "Error while reading input\n");
return 1;
}
最后不要忘记free
分配内存:
for (int i = 0; i < n; i++) {
free(A[i]);
}
free(A);
推荐阅读
- firebase - 在继续循环之前等待firebase响应
- python - Yaml 文件以不一致的格式保存内容,带有额外的花括号`{}`
- wordpress - 如何将图像分配给特定的 Wordpress 页面
- c# - 如何在 xamarin 中使用 mvvm 为 CollectionView 绑定滚动的 EventHendler
- python-3.x - 从 umap-learn 开始,我得到 numba 错误'操作数必须是相同类型,得到(i32,i64)'
- reactjs - 没有大气数据的谷歌地图自动完成reactjs
- php - 通过 ID 获取媒体模型并使用它来制作可下载的 URL 不起作用
- vhdl - 如何减少重复过程(握手)的状态逻辑冗余?
- wcf - 远程计算机中的 WCF netTcpBinding 超出消息大小配额
- sql - 如何为以下查询编写 sql 语句?