【问题标题】:[C]String and Array about %s , %c[C]关于 %s , %c 的字符串和数组
【发布时间】:2018-12-12 10:43:06
【问题描述】:

为什么我应该在这里使用 %c 而不是 %s? 如果我使用 %s 会出错

printf("%c",Array[i]);

当我定义char Array[STRSIZE]="apple"; should use %s here

那么如何正确使用 %s 和 %c 呢?

代码:

#include<stdio.h>
#include<string.h>
   int main(){
      #define STRSIZE 81

         char Array[STRSIZE];
         printf("Enter a string: ");
         gets(Array);
         printf("\nYou entered: ");
         int i ;
    for(i=0;i<strlen(Array);i++){

         printf("%c",Array[i]);
    }
   return 0 ;} 

结果:

Enter a string: apple
You entered: apple

【问题讨论】:

  • 检查类型!!

标签: c string printf


【解决方案1】:

%c 打印一个char%s 打印一个字符串,因此它需要一个指向 char 的指针。

char Array[STRSIZE];

这里,Arraychar 的数组,因此传递给函数的表达式Array 衰减为指向char 的指针。所以它可以用于%s(假设字符串有效)。

但是,

Array[i] 不是字符串。它是一个char,因此它可以传递给%c,但不能传递给%s。所以可能性是:

  • printf("%s",Array);打印一个字符串
  • 使用printf("%c",Array[i]); 打印该字符串的单个字符。通过遍历字符串,您也可以像这样打印整个字符串

【讨论】:

    【解决方案2】:

    你使用"%c"是正确的,但不要使用gets,不再是标准的一部分

    你可以使用fgets:

    char arr[STRSIZE] = {0};
    char *ptr;
    
    printf("Enter a string: ");
    if (fgets(arr, sizeof arr, stdin) {
        // skip the trailing new line
        ptr = strchr(arr, '\n');
        if (ptr != NULL) {
            *ptr = '\0';
        }
    }
    

    要打印字符串,只需使用:

    printf("%s\n", arr);
    

    【讨论】:

      【解决方案3】:

      处理传递给printf 的第二个参数的方式取决于通过%c%s 指定的类型。
      使用%c 它指示char 类型,因此函数将从内存中读取数据array[i] 指向的位置,大小为 char。
      其中,当您传递 %s 时,数据类型被视为 char 数组,因此该函数将读取字节,直到它从作为第二个参数传递的内存地址中获取 \0
      由于您将 char 类型变量传递给 %s,因此可能会导致运行时错误,因为存在类型不匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-07
        • 1970-01-01
        • 2011-08-01
        • 2015-03-23
        • 2014-07-04
        相关资源
        最近更新 更多