(我已经知道其他语言,但是我正在准备的考试需要知道我以前从未真正研究过的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 <---- ??
......以及其他有奇怪字符的行......
答案 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)获取真实的角色编号