1

所以我是 C 编程的初学者(我以前使用过 Ruby、Python 和 Haskell),我无法让最简单的东西在 C 中工作(可能是因为所有手动记忆的东西)。无论如何,我想要做的是(使用简单的构造)制作一个脚本,它只是回应用户输入到控制台的内容。

例如,用户输入 hi,控制台打印 hi。

这就是我想出的。

另外,我还没有真正掌握指针,所以没有。

// echo C script

int echo();

int main() {

    echo();
    return 0;

}

int echo() {
    char input[500];

    while (1) {
        if (scanf("%[^\n]", input) > 0) {
            printf("%s\n", input);
        }
        input[0] = 0;
    }
    return 1;
}

我意识到这里有很多不好的做法,比如设置一个巨大的字符串数组,但这只是为了简化它。

无论如何,我的问题是它重复第一个输入然后输入冻结。据我所知,它在 while 循环期间冻结(永远不会返回 1)。

任何帮助,将不胜感激。

哦,使用 TCC 作为编译器。

4

4 回答 4

3

你不需要一个数组来回显

#include <stdio.h>

int main(void)
{
    int c;

    while((c = getchar()) != EOF) putchar(c);
    return 0;
}
于 2013-08-08T16:12:52.690 回答
1

scanf("%[^\n]", input

应该:

scanf("%s",input)

然后在你是否应该这样做之后:

memset(input,0,500);

于 2013-08-08T16:10:07.157 回答
1

分配这么大的字符串很好,只要用户可以输入该长度的字符串。我将用于输入的是fgets(阅读以获得更多信息)。鉴于您仍想使用大小为 500 的字符串,在您的情况下正确使用是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int echo(){
    char input[500];
    while(fgets(input, 500, STDIN)){  //read from STDIN (aka command-line)
        printf("%s\n", input);  //print out what user typed in
        memset(input, 0, strlen(input));  //reset string to all 0's
    }
    return 1;
}

请注意,将 500 的值更改为任何较小的数字(按照惯例,我通常会使用 2 的幂,例如 512,但这并不重要)将限制用户输入该数字的长度。另请注意,我没有测试我的代码,但它应该可以工作。

于 2013-08-08T16:10:41.783 回答
0

有很多方法可以完成这项任务,但最简单的方法是一次从标准输入读取一个字节,并在处理每个字节时将该字节输出到标准输出。

片段:

#include <stdio.h>

int main( void ) {
  // Iterates until EOF is sent.
  for ( int byte = getchar(); byte != EOF; byte = getchar() ) {
    // Outputs to stdout the byte.
    putchar( byte );
  }

  return 0;
}

评论:

  • 您必须将通过标准输入读取的字节存储在一个整数中。这是因为您不能保证 char 是有符号还是无符号,实际上 C 中有 3 种 char 类型(char、signed char 和 unsigned char)。包括限制库以确定您的环境中是否已签名字符。
  • 您必须使用 C99 标准进行编译,否则将 byte 的声明移到 for 循环之外。
于 2013-08-08T18:39:22.887 回答