-1

我的目标是返回与我在标准输入中编写的相同文本的函数。作为以下代码编译的结果:

#include <stdio.h>

char chain[990];
int znaki()
{
scanf("%s", chain);
int i=0;
do{
    putchar(chain[i]);
    i++;
}
while(chain[i]!=10);
return 0;
}
int main(int argc, char **argv)
{
znaki();
return 0;
}

我得到:

我自己的文本

我自己的文本

许多

线条

一些随机文本,就像 linux 中的 cat /dev/random

第一行是我的输入。为什么?

4

3 回答 3

1
do {
    putchar(chain[i]);
    i++;
} while(chain[i]!=10);

此代码从链(以及更远)打印字符,直到找到代码为 10 的字符。由于缓冲区未初始化,它被其他程序的一些随机数据填充。你会看到这些数据。可能,你想写类似的东西

do {
    putchar(chain[i]);
    i++;
} while(i != 10);

这将从数组中打印前 10 个字符。

顺便说一句,代码似乎容易受到缓冲区溢出的影响。

于 2014-11-25T23:22:47.567 回答
0
  1. You have an array.
  2. You asked the user for a word, and you stored it in the beginning of that array.
  3. You then printed the array.

It's pretty obvious to me why the input you wrote was printed out.

于 2014-11-25T22:54:05.060 回答
0

chain[]没有10值。

chain充满了非空白字符 - 这就是"%s"指示scanf()要做的事情:扫描并保存非空白字符char10通常是'\n',一个空格。

char chain[990];
scanf("%s", chain);
...
while(chain[i]!=10);

而是使用fgets()读取

int znaki(void) {
  char chain[990];
  while (fgets(chain, sizeof chain, stdin) != NULL) {
   int i=0;
   while (chain[i] != '\n' && chain[i] != '\0') {
     putchar(chain[i]);
     i++;
   }
   return 0;
 }
于 2014-11-26T01:35:08.407 回答