【问题标题】:Print only letters from a string只打印字符串中的字母
【发布时间】:2014-04-11 22:53:02
【问题描述】:

我必须创建一个程序,它接收一个字符串并且只打印出字母(大写和小写)。我真的需要一些帮助来完成这个程序。

例如:

输入:Cat808her_+in_+e87

输出:凯瑟琳

输入:2012 年 11 月 06 日_ENEE140$$$exa !m

输出:NovENEEexam

#include <stdio.h>

char string[256];
int character;
int c=0;

int main(){
    printf("Enter a string: ");
    while((character=getchar()) != '\n'){
        if((character>='A'&&character<='Z')||(character>='a'&&character<='z')){
            c++;
            string[c]=character;
        }
        printf("Only letters: %s\n", string);
    }
    return 0;
}

【问题讨论】:

  • 它根本不起作用,什么也没有打印出来。
  • 在分配后执行c++
  • 你只想处理 ASCII?
  • 我只需要打印大小写字母
  • @user3473994:我问是因为在单字节字符集的 ASCII 之外,您必须使用 isalpha(),对于像 UTF-8 这样的多字节字符集,您需要其他库。

标签: c string io character ascii


【解决方案1】:

在您的循环中,您首先递增您的c,然后分配在string[c] 中获得的字母,前提是满足if 中的条件。

这意味着它将从string[1] 开始分配,让第一个保持原样。作为文件范围数组,char string[256] 将其字符初始化为零。因此,您的第一个元素将保持为零。

零遭遇意味着"%s"printf 中的类型说明符以及许多其他事物的字符串结束。因此,不会打印任何内容,因为以'\0' 开头的字符串在技术上没有任何内容。

只需在赋值后放置c++,您的代码应该没问题。您可以选择使用以下内容:

...
    string[c++] = character;
...

您不必包含终止零,因为您的字符串已经用零初始化。

您可以添加一些检查以不让c 超过 255,甚至 254,这样您就不会意外地将某些内容分配给最后一个零,或者尝试访问除此之外的任何内容,您不允许访问.

【讨论】:

    【解决方案2】:
    #include <stdio.h>
    #include <ctype.h>
    
    int main()
        {
        char string[255+1];
        char *cp;
    
        printf("Enter a string: ");
        fgets(string, sizeof(string), stdin);
        printf("Only letters: ");
        for(cp=string; *cp; ++cp)
            if(isalpha(*cp))
               printf("%c", *cp);
    
        printf("\n");
        return(0);
        }
    

    【讨论】:

      【解决方案3】:

      除了"string[c++] = character;"更正,对于该行:

      if((character>='A'&&character<='Z')||(character>='a'&&character<='z')){
      

      您可以或应该使用 isalpha() 函数(在顶部的 #include 之后),如下所示:

      if(isalpha(character){
      

      对于默认的“C”语言环境,这正是您想要的。您可能还想使用 fgets() 而不是 getchar(),这样可以防止输入缓冲区溢出。并将您的字符串初始化为所有空值:

      char string[256]={0};
      

      【讨论】:

        【解决方案4】:

        比较像c &gt; 'A' 这样的字符值在排序顺序与C 语言环境不同的某些语言环境中无法正常工作;使用 isalnum(c) 是要走的路。

        【讨论】:

        • 他不是在寻找字母数字,只是在寻找字母。正如@mahonri-moriancumer 所说,应该是isalpha()
        • 同意。但是,要明确表示不进行字符比较。合理的编译器会内联 isalpha() 或 isalnum() 调用,因此以正确的方式执行此操作通常更经济。
        【解决方案5】:

        这对我有用:

        #include <stdio.h>
        
        char string[256];
        int character;
        int c=0;
        
        int main(){
         printf("Enter a string: ");
         while((character=getchar()) != '\n'){
             if((character>='A'&&character<='Z')||(character>='a'&&character<='z')){
        
                 string[c++]=character;
             }
        
         }
         printf("Only letters: %s\n", string);
         return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2019-07-16
          • 2017-08-30
          • 2021-04-20
          • 1970-01-01
          • 1970-01-01
          • 2021-12-27
          • 2022-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多