Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 尝试通过数组打印用户输入时出现意外输出_C - Fatal编程技术网

C 尝试通过数组打印用户输入时出现意外输出

C 尝试通过数组打印用户输入时出现意外输出,c,C,此代码将用户输入接收到数组中,然后将其打印出来。每次我打印用户输入时,最后都会打印一个随机的额外字符 #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)

此代码将用户输入接收到数组中,然后将其打印出来。每次我打印用户输入时,最后都会打印一个随机的额外字符

#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]);
}

当你读这行新词时,我得到了abcu,而在第一个
for
循环中的更新表达式将
I
增加到了3


然后
arr[++i]='\n'
i
增加到4,并分配给
arr[4]
。从未将任何内容分配给
arr[3]
,但当从堆栈中分配数组时,该位置似乎碰巧包含
u

当您读取换行符时,
i
刚刚通过第一个
for
循环中的更新表达式增加到3

然后
arr[++i]='\n'
i
增加到4,并分配给
arr[4]
。从未将任何内容分配给
arr[3]
,但当从堆栈分配数组时,此位置似乎碰巧包含
u

此:

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 */
这:

应该是这样的:

for (i = 0;(c = getchar()) != '\n' && i < 100;++i)
    arr[i] = c;
arr[i] = '\n'; /* here */
改变这个

arr[++i] = '\n'; /* this skips the current a[i] & put \n into next position which is incorrect */

因为变量
i
在这里的
循环的
条件部分已经增加

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;
}
for(i=0;i
更改此选项

arr[++i] = '\n'; /* this skips the current a[i] & put \n into next position which is incorrect */

因为变量
i
在这里的
循环的
条件部分已经增加

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;
}
for(i=0;i
关于:

arr[++i] = '\n';
这是在分配
'\n'
之前递增的
i
,因此
arr[++i]
在数组中指向一个额外的字符

这就是打印意外字符的原因

如果将该语句替换为:

arr[i] = '\n';
您的代码应该可以工作。

关于:

arr[++i] = '\n';
这是在分配
'\n'
之前递增的
i
,因此
arr[++i]
在数组中指向一个额外的字符

这就是打印意外字符的原因

如果将该语句替换为:

arr[i] = '\n';

您的代码应该可以工作。

不需要的include:
#include
.1)发布的代码对用户可以输入的字符数没有限制。这是一个潜在的错误。2) 发布的代码无法输出最终的'\n',因此在程序结束之前,数据不会实际输出。您应该为
c
使用type
int
,而不是type
char
。这是
getchar
返回的类型,如果在检查前将结果强制转换为
char
,则无法正确区分
EOF
值。这是为什么使用预增量运算符(例如
+i
)的另一个示例应避免使用后增量运算符
i++
。此代码不应编译。您将定义
i
两次:
inti=0
用于(int i=0;arr[i]!='\n';++i)
。不需要的包括:
#include
。1)发布的代码对用户可以输入的字符数没有限制。这是一个潜在的错误。2) 发布的代码无法输出最终的'\n',因此在程序结束之前,数据不会实际输出。您应该为
c
使用type
int
,而不是type
char
。这是
getchar
返回的类型,如果在检查前将结果强制转换为
char
,则无法正确区分
EOF
值。这是为什么使用预增量运算符(例如
+i
)的另一个示例应避免使用后增量运算符
i++
。此代码不应编译。您将定义
i
两次:
inti=0
对于(int i=0;arr[i]!='\n';++i)
@JL2210,有许多方法可以更正代码。因此,要求OP以某种方式修复代码,就像您的编辑所做的那样,是非常误导的。这就是为什么我的(原始)答案是“建议”而不是要求具体的解决方案,这样更好吗?@JL2210:是的,这太好了better@JL2210,有许多方法可以更正代码。因此,要求OP以某种方式修复代码,就像您的编辑所做的那样,是非常误导的。这就是为什么我的(原始)答案是“建议”而不是要求具体的解决方案,这样更好吗?@JL2210:是的,这样更好