C语言-读入含空格的字符串

题目

输入一行字符,统计其中英文字母、空格、数字和其它字符的个数。

思路

  1. 没说到底输入几个字符,无法用循环给数组赋值

解决:

定义足够大的数组,然后以%s为输入格式,一次性输入字符。然后再通过访问数组的每个元素得到其ASCII码,通过条件控制语句输出。

#include <stdio.h>
int main(void) {
      char str1[5];  
      scanf(%s”,str1);//注意:不用加&  
      printf("%s\n", str1);     
      return 0; 
}

scanf()进行读取时,输入参数是已经定义好的“字符数组名”, 不用加&, 因为在C语言中数组名就代表该数组的起始地址。

  1. scanf()遇见空格就停止读取,无法统计空格的数目。

解决:

用gets()函数的话,遇到空格就不会返回了,遇到回车才返回。

#include <stdio.h>
int main(void) {
      char str1[5];  
      gets(str1);//与scanf的写法不同  
      printf("%s\n", str1);     
      return 0; 
}

代码

#include<stdio.h>
#include<string.h>
int main()
{
    char str[200];
    gets(str);//gets()和scanf()的输入格式不同。此处若用scanf()则总在空格键入时停止输入
    int n=strlen(str);
    int a[n];
    for(int i=0;i<n;i++){
        a[i]=str[i];
    }
    int w=0,x=0,y=0,z=0;
    for(int j=0;j<n;j++){
        if(a[j]>=65&&a[j]<=90){
            w++;
        }
        else if(a[j]>=97&&a[j]<=122){
            w++;
        }
        else if(a[j]==32){
            x++;
        }
        else if(a[j]>=48&&a[j]<=57){
            y++;
        }
        else{
            z++;
        }
    }
    printf("%d\n%d\n%d\n%d",w,x,y,z);
}

参考资料

  1. http://m.biancheng.net/view/232.html
  2. https://zhidao.baidu.com/question/54103433.html
可以使用fgets函数来读入带有字符串的输入,它的原型如下: ```c char *fgets(char *str, int n, FILE *stream); ``` 其中,str是指向字符数组的指针,用于存储读入字符串;n是读取的字符数,通常应该比str的长度小1,以便留出空间存放字符串结尾的\0;stream是指向输入流的指针,可以是标准输入流stdin,也可以是文件流。fgets函数会读取输入流中的一行字符,并将其存储到str中,直到读入n-1个字符、读取到换行符或者读取到文件结尾为止。如果输入行的长度超过了n-1个字符,fgets函数会将剩余的字符留在输入流中,下一次读取时仍然可以读取到它们。 下面是一个例子,演示如何使用fgets函数来遍历带有字符串而不读入空格: ```c #include <stdio.h> #include <string.h> int main() { char input[100]; while (fgets(input, sizeof(input), stdin)) { // 去掉字符串末尾的换行符 input[strcspn(input, "\n")] = '\0'; // 遍历字符串中的每个字符 for (int i = 0; i < strlen(input); i++) { printf("%c ", input[i]); } printf("\n"); } return 0; } ``` 上面的代码中,fgets函数读取输入行时会读取换行符,为了避免输出时出现多余的空行,我们需要手动将换行符替换为字符串结束符\0。然后,我们使用for循环遍历字符串中的每个字符,并将它们输出到屏幕上。注意,for循环中的strlen(input)不能在循环体外计算,因为输入行的长度可能会超过input数组的长度,导致字符串被截断。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值