我正在用我的C代码编写一个函数,我的函数被要求在由给定数量的字符组成的文件中随机搜索一个单词。 这是我的代码:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "string.h"
void ExtMot(char nom, char *s[80], int n )
{
FILE *fp ;
int i=0, j=0,x ;
int taille= n ;
srand (time (NULL)) ;
fp = fopen (nom,"r") ;
while (fgets (s, 80, fp))
{
i++ ;
}
printf (" enter the size ") ;
scanf ("%d",&taille) ;
do
{
x= rand ()* rand() % i ;
rewind(fp);
while (fgets (s, 80, fp))
{
j++ ;
if (j==x) break ;
}
s[strlen (s)]=' ' ;
if (strlen (s)-1 == taille )
break ;
else
j=0 ;
} while (1) ;
fclose (fp) ;
}
void main ()
{
char mot[80];
ExtMot("C:\Users\asus\Desktop\c_projet\hello\projet.txt",*mot,6);
printf ("%s",mot);
}
我调试了我的代码,在调用 fgets 函数时出现分段错误,控制台应用程序崩溃。有人可以帮助我识别错误吗?
我想知道你的代码是如何编译的(如果有的话)。您应该已经收到这些类型错误的左右警告。以下调整应该使您的代码编译(我用-Wall
编译),但我无法证明它的可靠性,因为我不知道您的helloprojet.txt
文件。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <errno.h>
// these headers were wrapped in quotes "", instead of angle brackets <>
void ExtMot(char *nom, char *s, int n) {
FILE *fp;
int j = 0, i, x;
int taille = n;
srand(time(NULL));
if (!(fp = fopen(nom, "r"))) {
fprintf(stderr, "Could not open file: %sn", strerror(errno));
return;
}
// always check if the result of fopen == null
for (i = 0; fgets(s, 80, fp); i++)
;
// rest of the code here...
}
int main(void) {
char mot[80];
ExtMot("C:\Users\asus\Desktop\c_projet\hello\projet.txt", mot, 6);
printf("%sn", mot);
return 0;
}
您尝试包含带有双引号的 C 标准库标题,而不是像您应该的那样使用尖括号。仅当头文件与源文件位于同一目录中时,才对包含使用双引号。您似乎对ExtMot()
参数中的类型有正确的想法,但它不会按照您期望的方式工作。char nom
是一个字符。char *m[80]
是一个包含 80 个指向字符的指针的数组,而不是一个包含 80 个字符的数组。
*mot
是指向 80 个字符数组的指针。mot
是 80 个字符的数组。因此,您没有将 char 缓冲区发送到ExtMot()
,而是发送 char 缓冲区在内存中的位置,这将破坏您的代码(并且应该触发来自编译器的警告)。请参阅上面的代码,了解如何将字符串传递给函数。
编辑:此外,void main()
已经过时,而且做法很糟糕。如果您不需要任何命令行参数,请始终使用int main(void)
并返回 0。
使用*mot
时,您将在需要指针的位置传递一个字符值(实际上您的编译器应该警告您)。因此,您传递一个不指向有效内存的"内存地址",然后fgets
写入该内存。此外,您将文件名作为单个字符传递,其中它应该是字符串。并始终检查fopen
的返回值。
按如下方式更改程序,至少此问题应该消失:
#include <errno.h>
void ExtMot(char *nom, char *s, int n ) {
...
fp = fopen (nom,"r");
if (!fp) {
fprintf(stderr, "error opening %s: %s", nom, strerror(errno));
return;
}
...
}
int main ()
{
char mot[80];
ExtMot("C:\Users\asus\Desktop\c_projet\hello\projet.txt",mot,6);
printf ("%s",mot);
}