c - 如何在 c 中使用 argc、argv[] 的同时提示用户输入?

标签 c arrays prompt cs50 getstring

所以我对编程完全陌生,我不确定我是否正确地问了这个问题。就输出匹配输入而言,代码完全符合我的要求。它只是应该吐出您输入的任何单词的第一个字母。

问题是我想提示用户输入并获取一串单词,然后将其输入到我猜的数组中?现在,我的程序让用户将其输入放在运行程序的同一行上。我不知道如何实现这一点,也无法找出放入谷歌的正确措辞。

include <stdio.h>
include <cs50.h>
include <ctype.h>


int main (int argc, string argv[])
{
    for (int i = 1; i < argc; i++)
    {

        printf("%c", toupper(argv[i][0]));
    }
    printf("\n");
}

我想我主要需要了解语法,如果我解释得很糟糕,抱歉。预先感谢您的任何帮助,请告诉我您是否需要我澄清一件事/

最佳答案

如果你只是需要吐出用户输入的每个字符串的第一个字母的大写版本,那么你不需要一个数组来存储任何输入;您只需从输入流中读取下一个字符,然后决定是否显示它。

使用printf将提示写入标准输出流(即控制台):

printf( "Gimme some words: " );

然后你会使用 getchar读取下一个输入字符,直到我们看到换行符或 EOF 已发出信号,这意味着您需要某种循环。对于此示例,for循环有点自然:

for ( int c = getchar(); c != '\n' && c != EOF; c = getchar() )
{
  // process input
}

for的结构循环是:

<strong>for (</strong> <em>expr1<sub>opt</sub></em> <strong>;</strong> <em>expr2<sub>opt</sub></em> <strong>;</strong> <em>expr3<sub>opt</sub></em> <strong> ) </strong> <em>statement</em>

<em>expr1</em>在循环执行之前计算一次。它通常用于设置初始循环状态。在本例中,我们创建 c变量并将其分配给从输入流读取的第一个字符。

<em>expr2</em>在循环体的每次迭代之前进行评估。如果此表达式的计算结果为非零 (true -ish) 值,则将执行循环体;否则,循环退出。在这种情况下,只要输入流上没有发出 EOF 信号,我们就会循环。如果<em>expr2</em>完全省略,假设为 true

<em>expr3</em>在循环体的每次迭代之后进行计算。它通常用于更新<em>expr2</em>中测试的条件。 。在本例中,我们正在更新 c是从输入流读取的下一个字符。

请注意,每个表达式都是可选的;如果您愿意,您可以将艾米其中一项或全部留空。事实上,在守护进程和事件驱动的 GUI 界面中看到“无限”循环是很常见的:

for ( ;; )
{
  // loop "forever"
}

现在,您需要决定是否打印当前字符。如果要打印用户输入的每个字符串的第一个字符,那么您需要确定“字符串中的第一个字符”的含义。对于此示例,我们简单地假设字符串是由空格(空格、制表符等)分隔的非空白字符序列。所以基本上,您想要打印一个或多个空白字符后的第一个空白字符。这意味着您需要跟踪最后一个字符是否为空格。最简单的方法是声明第二个变量来保存先前读取的字符:

for ( int c = getchar(), last = ' '; c != '\n' && c != EOF; last = c, c = getchar() )
{
  // process input
}

在这种情况下,我们扩展 <em>expr1</em>声明并初始化第二个变量 last 。我们初始化last第一次到一个空白处,这样我们就有了可以测试的有效内容。

我们还扩展 <em>expr3</em>更新last当前值为c在阅读下一个字符之前。

现在,我们只需要决定是否打印当前字符。我们的规则是,“如果前一个字符是空格并且当前字符不是空格,则打印当前字符”。

有一个标准库函数 isspace ,返回 true如果参数是空格字符:

#include <ctype.h> // for isspace function declaration
...
int c = getchar();
if ( isspace( c ) )
{
  // c is a whitespace character
}

因此我们可以按如下方式实现循环:

for ( int c = getchar(), last = ' '; c != EOF; last = c, c = getchar() )
{
  if ( isspace( last ) && !isspace( c ) )
    printf( "%c", toupper( c ) );
}

这是一个完整的示例:

#include <stdio.h>
#include <ctype.h>

int main( void )
{
  printf( "Gimme a bunch of words: " );
  for ( int c = getchar(), last = ' '; c != '\n' && c != EOF; last = c, c = getchar() )
  {
    if ( isspace( last ) && !isspace( c ) )
      putchar( toupper( c ) );
  }
  putchar( '\n' );

  return 0;
}

以及示例运行:

$ ./first
Gimme a bunch of words: this is a test of the emergency broadcast system
TIATOTEBS

此版本不使用argcargv根本没有,实际上从 main 的定义中忽略了它们。 。您可以结合这两种方法;使用命令行参数(如果有);如果没有,则提示用户输入:

int main( int argc, char **argv )
{
  if ( argc > 1 )
  {
    for ( int i = 1; i < argc; i++ )
      putchar( toupper( argv[i][0] ) );
    putchar( '\n' );
  }
  else
  {
    printf( "Gimme some words: " );
    for ( int c = getchar(), last = ' '; c != '\n' && c != EOF; last = c, c = getchar() )
    {
      if ( isspace( last ) && !isspace( c ) )
        putchar( toupper( c ) );
    }
    putchar( '\n' );
  }
  return 0;
}

所以我们可以做任何一个

$ ./first this is a test of the emergency broadcast system
TIATOTEBS

$ ./first
Gimme a bunch of words: This is a test of the emergency broadcast system
TIATOTEBS

关于c - 如何在 c 中使用 argc、argv[] 的同时提示用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45030846/

相关文章:

c - 为什么 getppid 返回相同的值,即使对于孙进程也是如此?

python - 什么是指向数组数据开头的 Python 缓冲区对象?

javascript - 在提示框中添加数字

c - 如何按字段之一对结构链接列表进行排序?

c - 如何制作可 Bootstrap ?

c - 链接器错误导致问题

java - 当循环结束时如何获取第一个索引的范围?

c - 通过引用传递c中的指针数组

JavaScript prompt() 在 AppJS 中不起作用

c - 如何使用 C 将所有内容从我的终端复制到一个文件,包括标准输出和提示符?