[英]C-language strstr segmentation fault
我是初學者,track.c:
#include <stdio.h>
#include <string.h>
char tracks[][5] = {
"one",
"two",
"three",
"four",
"five",
"six",
};
void track_search(char search_for[]) {
int i;
puts(search_for);
puts(strstr(tracks[0], search_for));
/*
for (i = 0; i < 6; i++) {
if (strstr(tracks[i], search_for)) {
printf("tracks %i: %s\n", i,tracks[i]);
} else {
puts("Nothing found");
}
}
*/
}
int main() {
char search_for[5];
printf("enter your word: ");
fgets(search_for, 5, stdin);
track_search(search_for);
return 0;
}
$ gcc tracks.c && ./a.out
輸入你的單詞:on
上
分段故障
但如果我使用puts(strstr(tracks [0],“on”)); 而不是puts(strstr(tracks [0],search_for)); 它會起作用葡萄酒,誰知道哪里出錯了?
這有幾個問題。
首先,未正確聲明常量數組。
char tracks[][5] = {
"one",
"two",
"three",
"four",
"five",
"six",
};
這表示“聲明一個任意長度的char[5]
數組char[5]
。 非常仔細地觀察那個數組內容,並考慮這些字符串的長度實際上是它的字符數加上零終結符的一個 。你有什么東西突然出現嗎?也許這個詞是"three"
?那就是5 + 1,或者6個字符寬,而不是5個。
試試這個:
const char *tracks[] =
{
"one",
"two",
"three",
"four",
"five",
"six"
};
並修改你的for循環,如下所示:
for (i = 0; i < sizeof(tracks)/sizeof(tracks[0]); ++i)
{
if (strstr(tracks[i], search_for))
printf("track[%d]: %s\n", i, tracks[i]);
}
注意:為了我自己的理智,我從循環中刪除了多余的“Nothing found”。
最后,獲取的字符串可能會在結尾處添加行尾( '\\n'
),如果是這樣,您應該檢查並取消它。 我會顯着延長輸入緩沖區的大小,然后在它存在的情況下修剪endl:
int main()
{
char search_for[64] = {0};
printf("enter your word: ");
if (fgets(search_for, sizeof(search_for), stdin))
{
size_t len = strlen(search_for);
if (len && search_for[len-1] == '\n')
search_for[len-1] = 0;
track_search(search_for);
}
else
{
perror("fgets failed.");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
這是因為fgets
讀取換行符,因此在"one"
找不到"on\\n"
"one"
,因此strstr
返回NULL,如果傳遞給puts
,則會導致分段錯誤。
您可能希望在讀取輸入后首先刪除換行符和其他空格,例如將新行/空格的第一次出現設置為0,如
char *p;
if(p = strchr(search_for, '\n')) *p = 0;
if(p = strchr(search_for, ' ')) *p = 0;
(對於"three"
, char[5]
也不夠,因為你需要額外的空終止符。)
你必須考慮兩件事:
如果單詞不在列表中,strstr()返回一個NULL指針,你不能將它傳遞給puts(),所以做例如
char *found = strstr(tracks[0], search_for);
if (found)
puts(found);
else
puts("The word '%s' was not found\n",search_for);
一旦你這樣做,你會發現fgets也會讀取你輸入的換行符。 因此,如果您輸入四個並按Enter鍵,您將搜索“四個\\ n”因此您應該刪除那個\\ n字符,例如do
char *p;
if ((p = strrchr(search_for, '\n')) != NULL) {
*p = 0;
}
用fgets讀取輸入后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.