[英]Constructing a char pointer array
我在将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;
}
好吧,对于初学者来说,您没有在arr中为memcpy分配任何空间,因此这一行memcpy(arr [w_count],curLine,strlen(curLine)); 正在将您的curLine复制到内存中的随机位置。 以后对arr的所有用法类似。
实际上,您需要这样做:
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将溢出arr
数组,长度为10。
顺便说一句,在C中,您不calloc
, malloc
和realloc
的返回值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.