0

我对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 个输入后,它说停止运行并说运行失败。

4

3 回答 3

3

这是您的直接问题:

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]);
于 2014-01-09T05:50:59.947 回答
2

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

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

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

于 2014-01-08T17:37:09.887 回答
0

我认为您也可以使用scanf_s(secure 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 新手,所以请随时改进这个答案。

于 2017-03-21T23:23:57.033 回答