0

(我已经知道其他语言,但是我正在准备的这次考试需要知道我以前从未真正研究过的 C。)

EDIT : WOAH SO MANY ANSWERS... Give me a few mins to read all of them, thank you so much !

这是我的代码

int main(int argc, char *argv[]) {
    char search_for[80]; // <----- I think the problem is either here
    printf("Search for : ? \n");
    fgets(search_for, 80, stdin); // <---- or here
    int i;
    for (i = 0; i < 80; i++) {
        printf("Char i : %c - %p \n", search_for[i], &search_for[i]);
    }

    return 0;
}

这是输出,最后看到那些奇怪的字符了吗?他们为什么在这里?

Search for : ? 
New
Char i : N - 0x7fff52eb4ba0 
Char i : e - 0x7fff52eb4ba1 
Char i : w - 0x7fff52eb4ba2 
Char i : 
 - 0x7fff52eb4ba3 
Char i : � - 0x7fff52eb4ba4 
Char i : � - 0x7fff52eb4ba5 
Char i : � - 0x7fff52eb4ba6 
Char i : � - 0x7fff52eb4ba7 
Char i : 
 - 0x7fff52eb4ba8 
Char i : � - 0x7fff52eb4ba9 
Char i : � - 0x7fff52eb4baa 
Char i : � - 0x7fff52eb4bab 
Char i :  - 0x7fff52eb4bac 
Char i : � - 0x7fff52eb4bad 
Char i : � - 0x7fff52eb4bae 
Char i : � - 0x7fff52eb4baf 
Char i : @ - 0x7fff52eb4bb0 <---- ??
Char i : ∑ - 0x7fff52eb4bb1 <---- ??
Char i : î - 0x7fff52eb4bb2 <---- ??
Char i : l - 0x7fff52eb4bb3 <---- ??
Char i : ˇ - 0x7fff52eb4bb4 <---- ??

...和其他带有奇怪字符的行..

4

5 回答 5

2

您的循环应该只打印字符串的长度。因此,循环应该是for (i = 0; i < strlen(search_for); i++)

除了字符串长度之外,由于您的数组未初始化,因此会打印堆栈的先前内容,这些内容会反映为特殊字符。

于 2013-04-11T08:16:40.637 回答
1

它们在那里是因为search_for没有初始化:

char search_for[80]; /* Will contain random characters. */

并且fgets()不一定会写入缓冲区中的每个元素。

循环虽然for访问. 不检查使用search_for的单元化元素而不是作为终止条件:search_forsearch_for[i]i < 80

for (int i = 0; search_for[i]; i++)

然后,当在 中遇到空终止字符时,此循环将终止,该字符search_for始终fgets()写入(并且之后不写入任何内容,因此是垃圾字符):

从给定的文件流中最多读取 count - 1 个字符并将它们存储在 str 中。生成的字符串始终以 NULL 结尾。如果出现文件结尾或找到换行符,则解析停止,在这种情况下 str 将包含该换行符。

于 2013-04-11T08:14:11.450 回答
1

出现奇怪的字符是因为只设置了字符串 +字符fgets的 3 个字符.... 其他字符未设置,因此可能包含随机值。"New"1 nul76 chars

如果您想确保它们被归零,请在声明之后使用,bzero(search_for, 80)或者只循环缓冲区而不是循环所有 80 个字符strlensearch_for

于 2013-04-11T08:15:55.380 回答
1

您正在打印char search_for[80]之前分配的内存位置中超出输入长度的任何内容。你应该初始化(清理)search_for数组。

你这样做char search_for[80] ={ 0 }; // initialize all 80 chars to zero

于 2013-04-11T08:16:06.173 回答
1

因为您没有正确初始化 char 数组 search_for,所以您只是得到随机字符。

当您键入以“New”开头的输入字符串时,您还在该单词之后键入了换行符 '\n' 并且您的数组初始化在那里结束。

您可以通过 strlen(search_for) 获取您的真实字符数

于 2013-04-11T08:16:42.023 回答