用户输入一个单词。该程序首先将所有字符转换为小写,然后仅大写第一个字符,然后打印单词。
我已经尝试过这种方法,但是没有用:
#include <stdio.h>
#include <string.h>
main()
{
char word[100][50];
int i, j, n;
printf("How many words: ");
scanf("%d", &n);
printf("Enter the words one by one\n");
for (i = 1; i <= n; i++)
{
scanf("%s", word[i]);
strlwr(word[i]);
}
for (i = 1; i <= n; i++)
toupper('word[i][1]');
for (i = 1; i <= n; i++)
printf("%s\n", word[i]);
}
例如,当我输入"RODRICK"
时,它将输出显示为"rodrick"
而不是"Rodrick"
。
答案 0 :(得分:3)
在C语言中,单引号内的所有内容都是整数字符常量。
按照标准中的规定。
整数字符常量是包含一个或多个多字节字符的序列 用单引号引起来,例如'x'。宽字符常量是相同的,除了前缀为 字母L。稍后会有一些例外,序列的元素是任意的 源字符集的成员;它们映射在实现定义中 执行字符集成员的方式。
由于'word[i][1]'
中有多个字节,因此行为是由实现定义的。
您可能想要的是
word[i][0] = toupper(word[i][0]);
在C中,索引从0
开始,而不是1
。
toupper()
仅返回一个值。原始数组元素值未修改。您可以将toupper()
返回的值分配回word[i][0]
。
您还应该为ctype.h
函数添加toupper()
头文件。
strlwr()
是非标准函数。您可以使用循环和tolower()
函数。参见How do I lowercase a string in C?。
scanf()
并不是读取用户输入的最佳方法,即使您使用它,也应检查返回值以查看是否成功。
相反,您可以使用fgets()
-sscanf()
组合。
答案 1 :(得分:0)
您的main()
函数缺少返回类型。根据语言标准main()
将返回一个int
eger。当函数不接受参数时,其参数列表应为void
,因此:
int main(void)
这里
printf("How many words: "); scanf("%d", &n);
您无需检查用户是否输入了数组word
范围内的数字。始终检查用户输入! n
应在[1, 100]
范围内:
printf("How many words: ");
if (scanf("%d", &n) != 1 || n < 1 || 100 < n) {
// handle the input error, maybe exit the program
}
请查看scanf()
的参考。 scanf()
返回成功分配的接收参数的数量。因此,如果scanf("%d", &n)
不返回1
,则无法读取int
的egg。
printf("Enter the words one by one\n"); for (i = 1; i <= n; i++)
C和C ++中的数组从索引0
开始,最后一个有效索引为size - 1
。对于数组word
,第一个有效索引是word[0]
,最后一个是word[99]
。您必须从i = 0
迭代到i < n
:
printf("Enter the words one by one\n");
for (i = 0; i < n; ++i)
scanf("%s", word[i]);
永远不要使用%s
格式说明符,而无需指定WIDTH
来限制scanf()
分配给参数的字符数。再次,请查看scanf()
的文档。
scanf("%49s", word[i]);
未指定WIDTH
是Buffer Overflow等待发生。如果用户输入的字符长于49个字符,其余的字符将保留在stdin
的缓冲区中,并在下次调用输入函数时读取。如果您不希望发生这种情况,而忽略其余内容,则必须考虑更复杂的方式来处理输入。
strlwr(word[i]);
请注意,strlwr()
不是标准库函数。参见strupr() and strlwr() in string.h part are of the ANSI standard?
for (i = 1; i <= n; i++) toupper('word[i][1]');
同样,从i = 0
迭代到i < n
。函数toupper()
接受一个字符(好吧,实际上是一个int
,因为它也处理EOF
),如果它是小写字符,则返回它的大写字母。您对返回的值不做任何事情。
for (i = 0; i < n; ++i)
word[i][0] = toupper(word[i][0]); // assign the result of toupper()
for (i = 1; i <= n; i++) printf("%s\n", word[i]);
已经说完了:
for (i = 0; i < n; ++i)
printf("%s\n", word[i]);
请注意,如果要打印字符串后跟换行符,可以简单地使用puts()
。
将所有内容放在一起:
#include <stdlib.h> // EXIT_FAILURE
#include <stdio.h> // printf(), scanf(), puts()
#include <ctype.h> // toupper()
#include <string.h> // _strlwr() (Microsoft)
int main(void)
{
printf("How many words: ");
int n;
if (scanf("%d", &n) != 1 || n < 1 || 100 < n) {
puts("Input error. :(\n");
return EXIT_FAILURE;
}
char word[100][50];
puts("Enter the words one by one\n");
for (int i = 0; i < n; ++i)
{
if (scanf("%49s", word[i]) != 1) {
puts("Input error. :(\n");
return EXIT_FAILURE;
}
_strlwr(word[i]);
}
for (int i = 0; i < n; ++i)
word[i][0] = (char)toupper(word[i][0]);
for (int i = 0; i < n; ++i)
puts(word[i]);
}
答案 2 :(得分:-1)
重要的是要知道何时使用函数时将其用作参数,返回的值以及包含它的lib。 我在整个代码中留下了注释,以说明我对您的代码所做的更改
祝你好运!
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
char word[100][50];
int i, n;
printf("How many words: ");
scanf("%d", &n);
printf("Enter the words one by one\n");
for (i = 0; i < n; i++)
{
//reconsider using scanf as it is an unsafe function and check input
//length is under 49 chars- last place must be saved for '\0'
scanf("%s", word[i]);
strlwr(word[i]);
}
//for each word in the array make first char upper case
//toupeer takes in an int an returns an int for the int value of the char in upper case
//if you don't place the return instead of the lower- it would have no effect
//it is important to note that toupper is in ctype.h and must be included
for (i = 0; i < n; i++)
{
word[i][0] = toupper(word[i][0]);
}
for (i = 0; i < n; i++)
printf("%s\n", word[i]);
return 0;
}