我对C语言相当陌生,我已经读了一本C书的几章,现在我必须做一个作业,但我都很困惑,希望有人可以帮助我。
我必须从用户(char 数组)输入中读取 2 个最大长度为 100 个字符的字符串,并将它们转换为大写字母,并在每个单词后用换行符 打印出来。
直到现在我有这个:
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] != ' ') {
chars[i] = str1[i];
toupper(chars[i]);
printf(chars[i]);
i++;
}
while (str2[j] != ' ') {
chars[j] = str2[j];
toupper(chars[j]);
printf(chars[j]);
j++;
}
return 0;
}
从用户那里获取 2 个输入后,它说停止运行并说运行失败。
你的直接问题:
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]);
str1 和 str2 更改为数组。 在前两个扫描中使用 %100[^]。这是一个正则表达式技巧,可以读取带有空格的字符串。
char str1[101];
char str2[101];
scanf("%100[^n]",str1);
scanf("%100[^n]",str2);
这将接受两个字符串.在输入第一个字符串后按回车键输入第二个字符串。
我认为您也可以使用scanf_s
(安全scanf
)并一次性收集用户输入的两个字符串。您还可以将数组大小定义为符号常量,以提高灵活性,位于程序顶部、main
外部和 #include
preprocesor 指令下方。
// 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 的新手,所以请随时改进这个答案。