【问题标题】:C Not able to include a format specifier when assign a stringC 分配字符串时无法包含格式说明符
【发布时间】:2017-03-29 19:55:07
【问题描述】:

我希望能够在为名为@9​​87654321@ 的字符串分配值时使用 %d 格式说明符。我尝试这样做,但在运行程序时无法将格式说明符替换为整数...... 这是我的代码:

#include <stdio.h>                                                                                                                                    
#include <stdlib.h>
int main(void)                                                                                                                                        
{                                                                                                                                                     
    const char *answer;                                                                                                                               
    int year;                                                                                                                                         
    printf("Enter a year: \n");                                                                                                                       
    scanf("%d", &year);                       
    if ( (year % 400 == 0) || ( (year % 4 == 0) && !(year % 100 == 0) ) ){                                                                            
        answer =  "%d does have a bissextus day", year;                                                                                               
    }                                                                                                                                                 
    else {                                                                                                                                            
        answer = "%d doesn't have a bissextus day", year;                                                                                             
    }                                                                                                                                                 

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

    return 0;                                                                                                                                         
}                                                   

我还想知道在这种情况下使用const char *answer 是否是一个不错的选择,如果不是,我想知道我应该改用什么。

【问题讨论】:

  • 您需要使用sprintf 函数打印到字符串。您不能更改常量字符串。
  • 你为什么要那样做?只需将printf 更改为:printf("%d %s have a bissextus day", is_bissextus, year);,其中is_bissextus 通过if 块设置为"does""doesn't"
  • @markgz:永远不要使用sprintf;请改用snprintf
  • 谢谢@markgz 但是我能用sprintf 函数做我想做的事吗?
  • @AndreKorol 避免潜在的缓冲区溢出。

标签: c string algorithm replace


【解决方案1】:

你可以使用snprintf:

char answer[34]; 
// ...                                                                                                                                                                               
snprintf(answer, 34, "%d does have a bissextus day", year);                                                                                               

【讨论】:

  • 我真的需要设置答案的大小吗?难道没有其他方法可以通过不定义它的大小来做到这一点吗?
  • @AndreKorol 你可以写size_t n = snprintf(NULL, 0, "%d does have a bissextus day", year); char answer[n+1]; snprintf(answer, sizeof answer, "%d does have a bissextus day", year);
  • 使用sprintf 而不是snprintf,您可以省略大小参数,但是sprintf 将写入缓冲区,无论是否有足够的空间存储字符串。
  • 谢谢@MM!这就是我喜欢的解决方案!哈哈 马上去试试。
  • 谢谢@tuple_cat!现在我明白了
【解决方案2】:

answer = "%d 确实有一个 bissextus 日", 年份;

在这里,您存储的字符串数据中 %d 甲酸盐说明符对 int 类型年份没有任何影响,您期望它应该打印年份。在 C 中用双引号括起来的东西被视为最后以 null 终止的字符串。

试试这个代码,简单直接:

#include <stdio.h>                                                                                                                                    
#include <stdlib.h>

int main(){                                                                                                                                                     
    int year;                                                                                                                                         
    printf("Enter a year:");                                                                                                                       
    scanf("%d", &year);                       

    if ( (year % 400 == 0) || ( (year % 4 == 0) && !(year % 100 == 0) ) ){                                                                            
        printf("%d does have a bissextus day", year);                                                                                               
    } else {                                                                                                                                            
        printf("%d doesn't have a bissextus day", year);                                                                                             
    }                                                                                                                                                 
    return 0;                                                                                                                                         
} 

输出:

./a.exe
Enter a year:2017
2017 doesn't have a bissextus day
$  ./a.exe
Enter a year:2000
2000 does have a bissextus day

【讨论】:

  • 感谢@LethalProgrammer 的回答!我已经知道如何做到这一点。我只是想以另一种方式做到这一点。但现在我想我真的会坚持基本的哈哈
猜你喜欢
  • 2017-08-04
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 2011-06-19
  • 2013-01-20
  • 1970-01-01
相关资源
最近更新 更多