我是C的新手,我尝试制作一个程序来计算运行程序时作为参数给出的句子中的单词。单词是由' '
,'\n'
,','
或'.'
分隔的字符或多个字符。示例:./words abc abc
= 2 words
但我一直在说:“segementation fault(core dumped)
”。以下是代码:
int main(char **argv)
{
char buf[80];
sprintf(buf,"%d words\n",words(argv));
write(1,buf,strlen(buf));
return 0;
}
int words(char **argv)
{
int i=0, sum=0;
while(argv[i] != '\0')
{
if(argv[i] == '.' || argv[i] == ',' || argv[i] == ' ' || argv[i] == '\n')
sum++;
i++;
}
}
答案 0 :(得分:1)
Argv是**char
或指向字符串数组的指针。您的代码将其视为单个字符串,因此循环遍历字符串并计算它们。由于这些指针都不为null,程序会继续超出数组的末尾,从而导致段错误。
答案 1 :(得分:1)
如果我没有弄错,那么参数会自动拆分为单独的字符串。这就是为什么你得到一个指针指针(例如char **
而不是char*
)。您只取消引用argv数组一次。试试这个:
while(argv[i] != NULL) {
i++;
}
其次,您无法以这种方式检测换行符,因为根据定义,您无法在参数中传递换行符。您可能想要做的是从stdin解析输入并调用您的程序,如下所示:
echo "abc abc" | ./words
或
./words < SOME_TEXT_FILE
最后但并非最不重要的是,你的单词函数不会返回任何内容,它需要返回i:
int words(char** argv) {
//...
return i;
}
这可能是您的程序段错误的原因,因为words()
的返回值将为NULL,然后sprintf将尝试取消引用该函数的结果。
所以整个功能需要看起来像这样:
int words(char** argv) {
int counter = 0;
while(char[i] != NULL) {
int j = 0;
while(char[i][j] != '\0') {
if(char[i][j] == '.') { //no need to check for '\n'...
counter++;
}
j++;
}
i++;
counter++;
}
return counter;
}
答案 2 :(得分:1)
me.c:2:5: warning: first argument of âmainâ should be âintâ [-Wmain]
me.c:2:5: warning: âmainâ takes only zero or two arguments [-Wmain]
me.c: In function âmainâ:
me.c:4:1: warning: implicit declaration of function âwordsâ [-Wimplicit-function-declaration]
me.c:5:1: warning: implicit declaration of function âwriteâ [-Wimplicit-function-declaration]
me.c:5:1: warning: implicit declaration of function âstrlenâ [-Wimplicit-function-declaration]
me.c:5:13: warning: incompatible implicit declaration of built-in function âstrlenâ [enabled by default]
me.c: In function âwordsâ:
me.c:11:16: warning: comparison between pointer and integer [enabled by default]
me.c:11:33: warning: comparison between pointer and integer [enabled by default]
me.c:11:51: warning: comparison between pointer and integer [enabled by default]
me.c:11:69: warning: comparison between pointer and integer [enabled by default]
gcc -Wall filename.c
将产生以上所有警告
这些是您的代码中的警告。避免所有。然后试试。
请在谷歌上搜索找到这些答案
how to use command line arguments
how to declare a function
how to compare strings and how '.' is differ from "."
答案 3 :(得分:1)
1.
迭代argv。
(请记住argv[i]
是指向char的指针,argv[0]
包含正在执行的程序的名称,以及argv的最后一个元素是NULL
指针
2.
使用strtok
库中的string.h
功能将argv[i]
与" .,\n"
分开。
(每次strtok返回非NULL值,你增加字数)
通过对命令行参数和strtok的一些阅读,您可以轻松地使其适用于传递的任何参数。