我在将getchar()的输入放入char * arr []数组时遇到了麻烦。我之所以这样做,是因为输入数据(带有命令行参数的文件)将存储在char指针数组中,以传递给execvp函数。
我正在使用getchar(),以后我可以实现一个功能,允许用户按下“标签”按钮并尝试将文件与已键入的文本匹配。
执行以下程序后,我键入: ls -a(带有尾随空格)
显然应该运行但不会,我得到SEG 11故障。如果有人能指出我做错了什么会非常好!!
感谢。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(){
char *arr[10];
int l_count = 0, w_count = 0;
char c;
char *curLine;
curLine = (char*)calloc(10, sizeof(char));
while((c=getchar()) != '\n'){
if (isspace(c)){
curLine[l_count]='\0';
memcpy(arr[w_count],curLine,strlen(curLine));
++w_count;
l_count=0;
}
else{
curLine[l_count]=c;
++l_count;
}
}
arr[w_count]='\0';
// Testing
int i;
for (i=0;i<2;i++){
printf("%s, ", arr[i]);
}
printf("\n");
return 0;
}
答案 0 :(得分:0)
对于初学者来说,你没有为memcpy在arr中分配任何空间所以这一行 的memcpy(ARR [w_count],curLine,strlen的(curLine)); 将你的curLine复制到内存中的随机位置。同样适用于arr的所有用法。
答案 1 :(得分:0)
其实你想要这个:
int main(){
char *arr[10];
int l_count = 0, w_count = 0;
char c;
char *curLine;
curLine = (char*)calloc(10, sizeof(char));
while (1)
{
c = getchar() ;
if (isspace(c)){
curLine[l_count]='\0';
arr[w_count] = curLine ;
++w_count;
l_count=0;
curLine = calloc(10, sizeof(char));
if (c == '\n')
break ;
}
else{
curLine[l_count]=c;
++l_count;
}
}
// Testing
int i;
for (i = 0; i < w_count; i++){
printf("%s, ", arr[i]);
}
printf("\n");
// free memory
for (i = 0; i < w_count; i++){
free(arr[i]);
}
return 0;
}
这里我们也释放了最后的记忆,这是一个很好的做法,即使程序在那里结束了。
这个程序有效,即使还有更多的检查要做,例如,如果输入一个超过9个字符的单词,它将溢出calloc
分配的内存,如果你输入超过10个单词il将溢出长度为10的arr
数组。
在C中BTW你不会强制转换calloc
,malloc
和realloc
的返回值。