【问题标题】:How to read a string from user input in C, put in array and print如何从C中的用户输入中读取字符串,放入数组并打印
【发布时间】:2013-10-08 17:13:42
【问题描述】:

我是 C 的新手,我已经阅读了我的 C 书籍的几章,现在我必须做一个作业,但我很困惑希望有人能帮助我。

我必须从用户(字符数组)输入中读取最大长度为 100 个字符的 2 个字符串,并将它们转换为大写字母,并在每个单词后用换行符 \n 打印出来。

到目前为止,我有这个:

int main() {
char chars[100];
int i = 0;
char str1;
char str2;
int j = 0;

scanf("\n %c", str1);
scanf("\n %c", str2);


while (str1[i] != '\0') {

    chars[i] = str1[i];
    toupper(chars[i]);
    printf(chars[i]);
    i++;

}

while (str2[j] != '\0') {

    chars[j] = str2[j];
    toupper(chars[j]);
    printf(chars[j]);
    j++;

}


return 0;
}

在接受用户的 2 个输入后,它说停止运行并说运行失败。

【问题讨论】:

  • str1str2 应该是数组
  • 我试试...没有任何区别,因为它在输入后仍然停止
  • 你的编译器没有给出任何警告,对吧?哦等等noez ...
  • @user1842140 提示:你想使用fgets()。谷歌其文档。 远离scanf()
  • 没有 fgets() 不可能吗?不确定我是否应该使用它。

标签: c arrays input user-input


【解决方案1】:

这是你的直接问题:

scanf("\n %c", str1);

此格式字符串告诉scanf 读取一定数量的空格后跟一个字符,该字符将存储在str1 中。

@H2CO3 是对的:scanf 几乎从来都不是读取用户输入的正确答案。它不执行边界检查,并且对用户输入的格式过于挑剔;一个意想不到的角色会完全混淆它。强烈建议您尽可能使用fgets

fgets(str1, 100, stdin);

如果不允许你这样做,你应该问你的教授为什么不这样做。认真的。

如果您绝对必须使用scanf 来读取此处的输入,您可以按照@user2479209 在他们的回答中描述的方式进行操作。

您的程序还有另一个问题,即toupper(chars[i]) 不会更改存储在chars[i] 中的值。您必须将toupper 的结果显式分配回数组,例如:

chars[i] = toupper(chars[i]);

【讨论】:

    【解决方案2】:

    将 str1 和 str2 更改为数组。在前两个 scanf 中使用 %100[^\n]。这是一个正则表达式技巧,可以读取带空格的字符串。阅读一下。

    char str1[101];
    char str2[101];
    scanf("%100[^\n]",str1);
    scanf("%100[^\n]",str2);
    

    这将接受两个字符串。输入第一个字符串后按回车键进入第二个。

    【讨论】:

      【解决方案3】:

      我认为您也可以使用scanf_s(安全scanf)并一次性收集用户输入的两个字符串。您还可以在程序顶部、main 之外和 #include 预处理器指令下方将数组大小定义为灵活的符号常量。

      // Symbolic constants
      #define SIZE 101
      
      char str1[SIZE];
      char str2[SIZE];
      scanf_s("%100s%100s", str1, SIZE, str2, SIZE);
      

      或者:

      scanf_s("%100s", str1, SIZE);
      scanf_s("%100s", str2, SIZE);
      

      我认为,如果你不想做#define SIZE 101,你也可以这样做:

      scanf_s("%100s", str1, 101);
      scanf_s("%100s", str2, 101);
      

      我是 C 新手,因此请随时改进此答案。

      【讨论】:

      • 您自己的问题最好作为一个单独的问题提出。
      猜你喜欢
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2015-12-20
      • 2011-04-30
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多