【问题标题】:How to take first letter from C string?如何从C字符串中取出第一个字母?
【发布时间】:2013-10-29 11:45:29
【问题描述】:

我想从我的 firstname 字符串变量中取出第一个字母并将它添加到 lastname 变量的第二个字母。

到目前为止我的程序是:

#include <stdio.h>

main() {
char firstname [256];
char lastname [256];
printf("What's your first name?: ");
scanf("%c",&firstname);
printf("What is your last name? ");
scanf("%s",&lastname);
printf("\nYour school.edu e-mail address is: %c%s2@school.edu",firstname,lastname);
return 0;
}

但是,我希望我的代码采用第一个首字母(名字的第一个字母)并将其存储到 firstname 变量中。

【问题讨论】:

  • 您是否在访问数组元素或覆盖现有数组时遇到问题?
  • 当您只对第一个字符感兴趣并存储第一个字符时,为什么还要有一个包含 256 个字符的数组?
  • 请张贴预期的输入和预期的输出。

标签: c string variables char scanf


【解决方案1】:

由于字符串是字符数组,所以需要从数组中取出第一个元素:

char firstname_initial;
firstname_initial = firstname[0]

还要注意,由于lastnamefirstname 是缓冲区,因此您不需要在scanf 中传递指向它们的指针:

scanf( "%s", firstname );
scanf( "%s", lastname );

最后一件事 - scanf 是一个危险的功能,你不应该使用它。

【讨论】:

  • 现在我得到错误:下标值既不是数组也不是指针
  • 摆脱了错误。但是现在当我输入名字时,它只是进入 firstname2@school.edu 甚至没有要求我扫描第二个名字,它不需要任何首字母
【解决方案2】:

假设用户类型:

Michael

响应第一个提示。 %c 格式读取为M%s 格式读取 ichael 无需费心获取任何新数据。

另外,您不应该传递&amp;firstname&amp;lastname;你应该只将firstnamelastname 传递给scanf()。区别在于类型;使用与号,您传递的 char (*)[256]scanf() 所期望的 char * 不同。你可以逍遥法外,但“逍遥法外”是有效术语。

对两个scanf() 调用使用%s 格式(或者,更好的是%255s 格式)。然后将firstname[0]lastname 传递给printf()。您可能想考虑在第一个字母上使用&lt;ctype.h&gt; 中的tolower(),也可以在姓氏上使用。

这是一个好的程序的合理近似:

#include <stdio.h>

int main(void)
{
    char firstname[256];
    char lastname[256];
    printf("What's your first name? ");
    if (scanf("%255s", firstname) != 1)
        return 1;
    printf("What's your last  name? ");
    if (scanf("%255s", lastname) != 1)
        return 1;
    printf("Your school.edu e-mail address is: %c%s2@school.edu\n",
           firstname[0], lastname);
    return 0;
}

它以一种或另一种方式避免了很多问题。它并非完全万无一失,但大多数人不会遇到问题。

【讨论】:

    【解决方案3】:
    #include <stdio.h>
    #include<string.h>
    main() {
    char firstname [256];
    char lastname [256];
    char str [50];
    printf("What's your first name?: ");
    scanf("%s",firstname);
    printf("What is your last name? ");
    scanf("%s",lastname);
    str = strcpy(str, firstname[0]);
    str = strcpy(str,lastname[1]);
    printf("\nYour school.edu e-mail address is: %s2@school.edu",str);
    return 0;
    }
    

    【讨论】:

    • 你有各种各样的问题。你不能像strcpy()那样复制firstname[0]。你也不能用lastname[1] 来做,而且你可能也不想做(lastname&amp;lastname[0] 代替)。您为复合名称分配了 50 个字节,但为姓氏分配了 256 个字节;这可能会导致崩溃。
    【解决方案4】:

    我认为您希望变量 firstname 仅存储首字母。 这样 firstname 就像字符串一样。

    firstname[1] = '\0'; //mark the end of string on second character
    printf("\nYour school.edu e-mail address is: %s%s2@school.edu",firstname,lastname);
    

    【讨论】:

      【解决方案5】:

      假设预期输入:

      fname = Batman
      lname = Joker
      

      预期输出:

      Your school.edu e-mail address is: BJBker2@school.edu
      

      试试这个:

      void main( void )
      {
      char fname = 0;
      char lname[256] = {0};
      
      printf("Enter firstname\n");
      scanf("%c", &fname);
      
      printf("Enter lastname\n");
      scanf("%s", lname);
      
      lname[1] = fname;
      
      printf("Your school.edu e-mail address is: %c%s2@school.edu\n", fname, lname);
      
      return;
      }
      

      【讨论】:

        【解决方案6】:

        从 c 字符串复制第一个字符

        char extractedchar = '0';
        extractedchar=myoldstring[0];
        

        注意:char '0' 只是为了稍后在应用程序中测试

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-11
          • 1970-01-01
          • 2016-01-04
          • 2016-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多