有一个名为prog1.txt的文件正在读入我的程序。要执行,我使用文件的名称和'<'要在文件中读取的符号。 (./a.out< prog1.txt)。然而,当我读它时,我立即收到分段错误。以下是我写的这个问题:
char *strPtr;
while(((*strPtr = getchar()) != EOF) && (*strPtr != '\n')) {
strPtr++;
}
我已经研究了其他问题,但我找不到一个问题,其解决方案可用于此。造成分段错误的原因是什么?
答案 0 :(得分:1)
你有一个指针char* strPtr
,但它可能不指向你可以使用的任何东西。你需要分配一些内存。 char* strPtr = malloc(numChars);
在您完成分配的内存后,您还应该释放它:free(strPtr);
您需要设置可以读取的最大字符数。在这种情况下,我使用numChars。
答案 1 :(得分:1)
创建指针不会创建指向它的东西。使用指针(或数组语法)时,程序员有责任确保正确设置内容。
getchar()
返回int
,EOF
是无法使用char
表示的值。因此,将char
类型的任何值与EOF
进行比较将始终失败。
您需要处理这两个问题。你不是。
例如;
char *strPtr = malloc(10);
int length = 0;
if (strPtr != NULL)
{
int achar;
while(length < 10 && (achar = getchar()) != EOF && achar != '\n')
{
strPtr[length] = (char)achar;
++length;
}
}
/* do whatever is needed with strPtr and length*/
free(strPtr);
strPtr
不是NULL
的检查是在尝试写入已分配的数组之前确保malloc()
调用成功。
length
用于确保代码在分配的长度之后不会写入strPtr
。
achar
用于在将值转换为EOF
之前检查char
(不在代码之后)。
答案 2 :(得分:0)
使用数组
char strPtr[10];
int temp;
int i = 0;
while( i < 10 && ((temp = getchar()) != EOF) && (temp != '\n')) {
strPtr[i] = temp;
i++;
}