c - 使用getchar输入字符串

标签 c string while-loop getchar

我正在尝试将一个字符串读入一个长度由用户选择的字符数组。问题是 getchar() 不会停止读取,直到用户根据我的代码按回车键手动输入换行符。我已经阅读了其他人的帖子,并且我明白为什么我不能这样做,这与我的作业讲义完全矛盾。

int chPrompt(int nchars);
void strInput(char str[], int nchars);

int main(void) {
    int nchars = chPrompt(nchars);
    char str[nchars];

    strInput(str, nchars);

    return 0;
}

int chPrompt(int nchars) {
    printf("How many chars do you need to input? >");

    return scanf("%i", &nchars);
}

void strInput(char str[], int nchars) {
    int i = 0;

    while((str[i] = getchar()) != '\n') {
        if(i > nchars-1)
            break;
        i++;
    }
    str[i] = '\0';

    //Troubleshooting
    printf("%s %d", str, strlen(str));
}

这是讲义上说的:

使用我们讨论过的技术从键盘输入一个字符串(包括空格) 关于(使用 getchar(),而不是 gets()、fgets() 或 scanf()), 扩充以便它可以输入最多但不超过 80 的任何数量 人物。确保在输入后的适当位置有一个空值。

我们在类里面讨论的技术是将 getchar 赋值给 char 数组的 while 循环。

我的问题: 我的教授非常坚持他的指示。在这份讲义中,他特别告诉我输入最多但不超过 80 的任意数量。这与 getchar 的功能相矛盾,对吗?有什么方法可以使用这种“技术”来限制字符串的长度吗?

在我发现的一些线程中,人们提到它可能取决于操作系统。所以,如果这很重要,我使用的是 Windows 8.1。

最佳答案

Op 的代码很接近。

“getchar() 不会停止读取,直到用户通过按 enter 手动输入换行符”是不正确的。
典型的用户输入是行缓冲。在 Enter 发生之前,不会向程序提供任何内容。那时整行都给了程序。 getchar() 一次从 stdin 消耗 1 个 char

1)需要分配足够的缓冲内存@Grzegorz Szpetkowski
2) 将输入读取为 int 并根据需要读取额外内容。
3) 不要将scanf()的值作为要读取的数量返回。
4) 读取要读取的char个数后读取剩余行。 @Grzegorz Szpetkowski

getchar() 返回一个 unsigned charEOF。这通常是 257 个不同的结果。将 getchar() 读入 char 就失去了这种区别。

void strInput(char str[], int nchars) {
  int i = 0;
  int ch;
  while((ch = getchar()) != '\n' && ch != EOF ) {
    if (i < nchars) {
       str[i++] = ch;
    }
  }
  str[i] = '\0';
}

int main(void) {
  int nchars = chPrompt(nchars);
  char str[nchars + 1];  // + 1
  strInput(str, nchars);

  //Troubleshooting
  printf("'%s' %zu", str, strlen(str));

  return 0;
}

int chPrompt(int nchars) {
  printf("How many chars do you need to input? >");
  if (scanf("%i", &nchars) != 1) {
    printf("Unable to read #\n"); 
    exit(-1);
  }

  // Consume remaining text in the line
  int ch;
  while((ch = getchar()) != '\n' && ch != EOF );

  return nchars;
}

注意:strlen() 返回类型size_t,而不是int,这在你的平台上可能/可能不一样,最好使用正确的格式说明符 "%zu"strlen()。或者使用:

printf("'%s' %d", str, (int) strlen(str));

关于c - 使用getchar输入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26963664/

相关文章:

c - C Segmentation Fault中的二叉搜索树

php - 根据日期名称读取多个文本文件并将所有内容写入连接字符串

python - 在字符串中使用 len()

c - 在 C 中打印字符指针数组时出现奇怪的输出

c++ - 如何从进程内部确定 CPU 和内存消耗

c - C中的数组分配错误

c - 如何声明指向文件的动态指针数组

PHP:将字符串的字符移动5个空格?这样A就变成了F,B就变成了G等等

java - 在 Java 的 While 循环中检查字符串的快捷方式?

c++ - 检查 Char 中的空格和检查字符串中的数字