strstr函数与c语言中的多维数组
输出strstr函数与c语言中的多维数组,c,initialization,fgets,c-strings,strstr,C,Initialization,Fgets,C Strings,Strstr,输出 最有可能是通过fgets()输入的问题 您正在读取指向\u search\u str的未初始化指针,该指针未指向有效的内存位置。在这种情况下,您只需将其更改为数组,如char to_search_str[80]={0}并完成它 您需要修剪存储在输入缓冲区中的尾随换行符 从(矿山) fgets()从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行后,读取停止如果读取换行符,则将其存储到缓冲区。在缓冲区中最后一个字符后存储终止的空字节('\0') 一个快速的
最有可能是通过
fgets()输入的问题
- 您正在读取指向\u search\u str的未初始化指针
,该指针未指向有效的内存位置。在这种情况下,您只需将其更改为数组,如char to_search_str[80]={0}代码>并完成它
- 您需要修剪存储在输入缓冲区中的尾随换行符
从(矿山)
fgets()
从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF
或换行后,读取停止如果读取换行符,则将其存储到缓冲区。在缓冲区中最后一个字符后存储终止的空字节('\0'
)
一个快速的方法是to_search_str[strcspn(to_search_str,“\n”)]=0
,但在char*to_search_str中提到了更为健壮的方法
是未初始化的指针,向其写入将导致未定义的行为。您必须分配内存或使用数组来代替char to_search_str[100]代码>例如
另外,不要忘记,fgets
还会将换行符读入缓冲区,您必须将其删除。您没有将分配给搜索\u str
指针,即传递给fgets
的指针作为目标缓冲区。由于它实际上未初始化,这会导致未定义的行为,通常以程序崩溃结束
您只需要静态或动态地分配它
最简单的解决方案就是在堆栈中定义一个静态数组:
#include <stdio.h>
#include <string.h>
void find_track(char *search_for);
char tracks[][80] = {
"I left my heart in Harvard Med School",
"Newark, Newark - a wonderful town",
"Dancing with a Dork",
"From here to maternity",
"The girl from Iwo Jima"
};
int main() {
char to_search_str[80];
printf("Search for: ");
fgets(to_search_str, 80, stdin);
to_search_str[strlen(to_search_str)-1] = '\0';
find_track(to_search_str);
return 0;
}
void find_track(char *search_for) {
int i;
for (i=0; i<5; i++) {
if (strstr(tracks[i], search_for)) {
printf("Track %d: '%s'\n", i, tracks[i]);
}
}
}
注意:由于fgets
在输出缓冲区中保留尾随换行符“`\n`',我们必须将其删除。我使用了所描述的聪明的oneliner解决方案。这段代码在main中
#include <string.h>
#define LEN 80
int main() {
char * to_search_str = malloc(LEN);
printf("Search for: ");
fgets(to_search_str, LEN, stdin);
/* Remove trailing newline from the string to search */
to_search_str[strcspn(to_search_str, "\n")] = 0;
find_track(to_search_str);
free(to_search_str);
return 0;
}
调用未定义的行为,因为指向\u search\u str
的指针未初始化且具有不确定的值
看来你至少是认真的
char *to_search_str;
printf("Search for: ");
fgets(to_search_str, 80, stdin);
函数fgets
可以将新行字符'\n'
附加到输入的字符串中
例如,您需要通过以下方式删除它
char to_search_str[80];
printf("Search for: ");
fgets(to_search_str, 80, stdin);
函数find_track
应至少声明为
to_search_str[ strcspn( to_search_str, "\n" ) ] = '\0';
尽管当函数定义依赖于全局变量时,这是一个坏主意
此外,查找相关字符串的方法也不好。例如,用户可以输入仅包含一个字符的字符串'a'
。在这种情况下,所有记录都将满足条件。您应该检查搜索的字符串是否在数组中的字符串中形成一个单词(由空格分隔的字符序列)。示例输入文件是什么样子的?请编辑您的问题并张贴代表金额。在修复了其他人在下面提到的bug之后,您可能需要将args的顺序颠倒为strstr
。例如,如果输入行是:我最喜欢的歌曲是:“与傻瓜跳舞”,但我也喜欢:“硫磺岛的女孩”还有。
我刚开始学习C。我假设输入的只是一个单词,比如舞蹈
或'Harvard'@CraigEstey,我不需要颠倒args的顺序,它很好,很好。有两种类型的搜索:(1)在[long]输入句子中,查找与歌曲歌词行之一的匹配项。(2) 在一个有单词列表的文件中,每行一个单词,查看给定歌词中的单词。您的问题不清楚哪一个是期望的结果[因为没有提供示例输入]。您编辑的代码[仍然]不正确。您正在使用to_search_str[strlen(to_search_str)-2]='\0'剪裁过多的字符代码>--它应该仅为-1
。如您所知,输入行为Harvard
-->Harvar
。另外,像这样的行非常出色
-->非常出色
,即使不应该匹配,也会匹配。此外,即使使用-1
修复,一些输入文件也会保留最后一行换行符,因此代码会切掉最后一行。摆脱换行符的可靠方法:*strchnul(to_search_str,'\n')=0代码>[这与Vlad建议的strcspn类似,但速度更快]我不是你的DVer,而是两件事。(1) 我会这样做(例如):#定义len80
,然后char*to_search\u str=malloc(LEN);fgets(至搜索街、LEN街、stdin街)代码>或者,只是:char to_search_str[80];fgets(至搜索街、sizeof(至搜索街)、stdin)代码>(2)但是,真正的问题可能是代码需要切掉换行符。在我看来,没有解释的DVG不是一条路。通常,允许响应者修复的注释就足够了。只有当回复者并没有纠正一个错误的答案时,才应该使用DV。@CraigEstey谢谢你们的评论。我肯定可以添加#define LEN 80
;我会在我的实际代码中使用它,但我没有在我的答案中包含它。我不确定尾随换行符的问题,因为:1)问题中没有提到这个要求(人们可能真的想保留它)-2)OP的测试语句不包含换行符。@CraigEstey我还添加了一个关于删除尾随换行符的注释。需要换行符条带。如果您运行的[例如您的]版本没有换行符,则搜索提示字符串Harvard\n
将失败。使用strip,要搜索的字符串将是Harvard
,这将成功。@RobertoCaboni感谢您从现在起的澄清,我确保永远不会使用该方法删除换行符
char to_search_str[80];
printf("Search for: ");
fgets(to_search_str, 80, stdin);
to_search_str[ strcspn( to_search_str, "\n" ) ] = '\0';
void find_track( const char *search_for);