如何用大写字母将单词的第一个字符大写,然后再打印

时间:2019-05-18 06:34:06

标签: c

用户输入一个单词。该程序首先将所有字符转换为小写,然后仅大写第一个字符,然后打印单词。

我已经尝试过这种方法,但是没有用:

#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"

3 个答案:

答案 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]);

未指定WIDTHBuffer 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;
}