在没有stange chars的情况下初始化C数组?

时间:2013-04-11 08:12:10

标签: c arrays syntax char

(我已经知道其他语言,但是我正在准备的考试需要知道我以前从未真正研究过的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 <---- ??

......以及其他有奇怪字符的行......

5 个答案:

答案 0 :(得分:2)

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

超出字符串长度,因为您的数组未初始化,所以打印堆栈的先前内容将反映为特殊字符。

答案 1 :(得分:1)

他们在那里因为search_for未初始化:

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

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

for循环访问search_for中的每个元素。要检查search_for使用search_for[i]而不是i < 80作为终止条件的单位元素:

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

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

  

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

答案 2 :(得分:1)

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

如果您想确定它们已归零,请在声明后立即使用bzero(search_for, 80) 或者只是为strlen缓冲区的search_for循环而不是为所有80个字符循环

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

您可以通过strlen(search_for)获取真实的角色编号