此代码将用户输入输入到数组中,然后将其打印。每次我打印用户输入时,都会在末尾打印一个随机额外的字符。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char arr[100];
char c;
printf("Enter a Sentence:");
int i =0;
for (i = 0;(c = getchar()) != 'n';++i)
arr[i] = c;
arr[++i] = 'n';
for (int i = 0;arr[i] != 'n';++i)
putchar(arr[i]);
}
例如,我期望
的输出Enter a sentence:abc
为abc
,但我得到了abcu
。
更改此
arr[++i] = 'n'; /* this skips the current a[i] & put n into next position which is incorrect */
to
arr[i] = 'n';
作为变量i
在for
循环的条件部分中已经增加了此处
for (i = 0;(c = getchar()) != 'n';++i /* before loop terminating i incremented here */) {
arr[i] = c;
}
也可以在声明自己的同时避免获得一些垃圾价值的同时初始化缓冲区。例如
char arr[100] = {}; /* zerod whole array */
,还要确保此(c = getchar()) != 'n'
不会发生>100
次,而缓冲区溢出发生了,这导致未定义的行为。一种可能的方法是
for (i = 0; i < sizeof(arr)-1 && (c = getchar()) != 'n';++i) {
arr[i] = c;
}
this:
for (i = 0;(c = getchar()) != 'n';++i)
arr[i] = c;
arr[++i] = 'n'; /* here */
应该是这样:
for (i = 0;(c = getchar()) != 'n' && i < 100;++i)
arr[i] = c;
arr[i] = 'n'; /* here */
您正在跳过一个缓冲区的一个字符,因为在上一个循环的末尾,i
已经递增。这是从缓冲区读取非初始化的数据(大概是源自堆栈(。
您也不会停止越过缓冲区的末端,这可能会导致缓冲区溢出。
与此一起,您可能应该以此初始化数组:
char arr[100] = { ' ' };
关于:
arr[++i] = 'n';
这是在分配'n'
之前将i
递增,因此arr[++i]
将额外的字符指向数组。
这就是为什么要打印出意外角色的原因。
如果您替换为:
arr[i] = 'n';
您的代码应起作用。
当您阅读newline时,i
刚刚通过第一个for
循环中的更新表达式增加到3。
然后arr[++i] = 'n'
将i
增加到4并分配给arr[4]
。从来没有任何分配给arr[3]
的东西,但是当从堆栈分配数组时,该位置恰好包含u
。