【问题标题】:appending integers as strings to a char[] in a loop在循环中将整数作为字符串附加到 char[]
【发布时间】:2018-12-27 04:40:37
【问题描述】:

给出以下示例。

我通过在每个字符的数字表示中添加一个秘密数字来对字符串进行编码。

A -> 41 = 65 + secret
B -> 42 = 66 + secret
1 -> 31 = 49 + secret
2 -> 32 = 50 + secret
and so on

所以结果会有几个数字。我可以使用

打印它们
for(int i=0; i<len; i++) {     
    int e = ( (int)caracter + pub ) % mod;
    printf("%d ", e);                        
} 

但是我怎样才能将所有这些数字添加到一个字符串中,例如

123465 123466 123449 123450

谢谢

【问题讨论】:

  • 结合sprintfstrcat,或者sprintfstrlen,可以做你想做的事。
  • 您需要认识到的是,ASCII 为本质上是一个字节(两个十六进制数字)的值提供了一个单一的字符表示。出于输出目的,您可能希望为每个字符输出 2 位十六进制值。简单地将编码字符串视为 unsigned char 数组很方便。 (这就是加密程序处理问题的方式)

标签: c char int


【解决方案1】:

https://www.tutorialspoint.com/c_standard_library/c_function_sprintf.htm

http://www.cplusplus.com/reference/cstdio/sprintf/

注意缓冲区大小。你可以做溢出。

例子:

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

int main() {
    int e[5] = {12,34,78,33,15577};
    int n = 5;
    int len = 0;
    int i = n;
    while (i--) len += snprintf(NULL, 0, "%d ", e[i]);
    char* str = (char*)malloc(sizeof(char)*len);
    char* str_cur = str;
    i = n;
    while (i--) str_cur += sprintf(str_cur, "%d ", e[i]);
    printf("%s",str);
    return 0;
}

返回

15577 33 78 34 12

【讨论】:

  • 越来越好,但是,为了争论,如果您的两个编码值最终为 'c'(2 位 int 值)和 'd'(3 位 @987654328 @ 价值)。如果您需要回读您的编码字符串,您如何区分 2 位和 3 位数字值? (提示:通过将每个字节处理为 2 位十六进制值,问题就消失了……)值得理解和至少解决的事情。见:ASCIITable.com
  • 什么问题?逐字符读取。将每个字符放入缓冲区。如果找到空间,则将缓冲区解码为 int。是的,十六进制更好。但一切都比使用静态移位编码文本要好。
猜你喜欢
  • 2012-08-19
  • 1970-01-01
  • 2017-08-20
  • 2013-01-04
  • 2021-02-14
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多