为什么我会收到 Segmentation fault 11(使用 fgets 读取输入并存储在数组中)?
Why am I getting Segmentation fault 11 (reading inputs using fgets and storing in array)?
很抱歉,如果这是一个非常菜鸟的问题,我是 C 语言的初学者,在理解指针和其他概念方面遇到了很大的困难,因此非常困难。出现分段错误,我不知道为什么请帮忙。我想可能是从使用数组来存储。另外,如果你能推荐一个调试器会很有帮助。提前致谢。
#include <stdio.h>
#include <string.h>
char *lineaccept(char *buf, size_t sz){ //Getting inputs using fgets() and storing it in buf.
if(fgets(buf,sz,stdin)==NULL){
printf("ERROR\n");
return NULL;
}
if(strlen(buf) == 1) {
printf("ERROR\n");
return NULL;
}
return buf;
}
void delimitLine(char *buf, char *delimited[], size_t max){ //Taking the string from buf and getting each individual word to store in split[]
if(buf != NULL){
const char s[2] = " ";
char *token;
token = strtok(buf, s);
int counter = 0;
while( token != NULL && counter <= max){
split[counter] = token;
token = strtok(NULL, s);
counter ++;
}
for(int y = 0; y < counter; y++){
if(split[y]==NULL){
break;
}else{
printf("%s\n",split[y]);
}
}
}
}
int main(void) {
const int maxWords = 10;
char maxLenInput[11];
char *arrOfWords[100];
char inputFromLine[100];
while(strcmp((strcpy(inputFromLine,lineaccept(maxLenInput, maxWords))), "")>0) {
delimitline(inputFromLine, arrOfWords, maxWords);
}
return 0;
}
如果您在控制台中仅按 Enter(没有在 "Enter" 之前键入任何其他字符),则代码的以下部分将 return NULL
。这是因为 fgets
会将新行存储为 buf
中的唯一字符,这样 strlen(buf)
将是 1
那么:
char *read_line(char *buf, size_t sz){
....
if (fgets(buf,sz,stdin)) {
if(strlen(buf) == 1) {
return NULL;
...
当您随后将 read_line
的调用结果传递给 strcpy
时,就像您对
所做的那样
strcpy(inputFromLine,read_line(maxLenInput, maxWords)
然后你实际上将 NULL
传递给 strcpy
并由此访问 "invalid" 内存;未定义的行为,可能是段错误。
很抱歉,如果这是一个非常菜鸟的问题,我是 C 语言的初学者,在理解指针和其他概念方面遇到了很大的困难,因此非常困难。出现分段错误,我不知道为什么请帮忙。我想可能是从使用数组来存储。另外,如果你能推荐一个调试器会很有帮助。提前致谢。
#include <stdio.h>
#include <string.h>
char *lineaccept(char *buf, size_t sz){ //Getting inputs using fgets() and storing it in buf.
if(fgets(buf,sz,stdin)==NULL){
printf("ERROR\n");
return NULL;
}
if(strlen(buf) == 1) {
printf("ERROR\n");
return NULL;
}
return buf;
}
void delimitLine(char *buf, char *delimited[], size_t max){ //Taking the string from buf and getting each individual word to store in split[]
if(buf != NULL){
const char s[2] = " ";
char *token;
token = strtok(buf, s);
int counter = 0;
while( token != NULL && counter <= max){
split[counter] = token;
token = strtok(NULL, s);
counter ++;
}
for(int y = 0; y < counter; y++){
if(split[y]==NULL){
break;
}else{
printf("%s\n",split[y]);
}
}
}
}
int main(void) {
const int maxWords = 10;
char maxLenInput[11];
char *arrOfWords[100];
char inputFromLine[100];
while(strcmp((strcpy(inputFromLine,lineaccept(maxLenInput, maxWords))), "")>0) {
delimitline(inputFromLine, arrOfWords, maxWords);
}
return 0;
}
如果您在控制台中仅按 Enter(没有在 "Enter" 之前键入任何其他字符),则代码的以下部分将 return NULL
。这是因为 fgets
会将新行存储为 buf
中的唯一字符,这样 strlen(buf)
将是 1
那么:
char *read_line(char *buf, size_t sz){
....
if (fgets(buf,sz,stdin)) {
if(strlen(buf) == 1) {
return NULL;
...
当您随后将 read_line
的调用结果传递给 strcpy
时,就像您对
strcpy(inputFromLine,read_line(maxLenInput, maxWords)
然后你实际上将 NULL
传递给 strcpy
并由此访问 "invalid" 内存;未定义的行为,可能是段错误。