- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试读取包含一系列数字的文件
例子:
43917778700000762841090006653470575088202000
43919478100000762851090006653540575088203000
43919765400000815661090006653620575088204000
typedef struct rArc{
long long int code;
}data;
int main(){
long long int code,i=0;
FILE *arc;
data *v;
v = NULL;
arc = fopen("CODES.txt","r");
while(fscanf(arc,"%lld",&code) != EOF){
v = (data *)realloc(v,sizeof(data) * (i + 1));
v[i].code = code;
i++;
}
for(int j=0;j<i;j++){
printf("%lld\n",v[j].code);
}
}
while(fscanf(arc,"%45s\n",&code) != EOF){
v = (data *)realloc(v,sizeof(data) * (i + 1));
v[i].code = code;
i++;
}
for(int j=0;j<i;j++){
printf("%45s\n",v[j].code);
}
}
最佳答案
即使在评论中进行了 3 次澄清之后,我仍然不完全清楚您的算法,但我相信我对它的理解足以提供帮助。从您对我的评论的回复中,我了解到您想将 10th, 21st & 32nd
字符处的文本替换为通过以下方式获得的值:
2
相乘产生总和,首先将第一个字符乘以 2
,第二个字符乘以 1
,第三个字符乘以 2
并继续乘以每个数字的 1-2-1-2-1...
模式,直到达到所需的索引,最后为 2
模式10
的任何倍数超过 10
,那么您通过乘积模 sum = sum + (digit * 2-1-multiple) % 10
(例如 10
)来增加总和(或者您可能希望在第 10 个、第 21 个和第 32 个字符的每次替换之前通过 stdin
修改累计总和部分仍不清楚)2-1-2-1...
中读取,例如
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXC 512 /* constant for line-buffer size */
int main (int argc, char **argv) {
char buf[MAXC] = ""; /* buffer to read each line */
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
'\n'
乘数序列和运行总和的方法。虽然这里不需要(您只能通过第 32 个字符访问,但最好通过
fgets
(或 POSIX
getline
)修剪缓冲区中包含的尾随
#define
作为验证所有字符都适合您的缓冲区的一部分,例如
while (fgets (buf, MAXC, fp)) { /* read each line into buf */
int const pos[] = { 10, 21, 32 }, /* indexes to replace */
npos = sizeof pos / sizeof *pos; /* no. of indexes */
int ndx = 0, /* buffer index */
*pdx = (int *)pos, /* pointer to pos */
mult = 2; /* 2-1-2-... multiplier */
size_t len = strlen (buf); /* length of string */
unsigned sum = 0; /* sum of digits */
if (len && buf[len - 1] == '\n') /* check for trailing '\n' */
buf[--len] = 0; /* overwrite with nul-character */
else if (len == MAXC - 1) { /* otherwise string too long */
fprintf (stderr, "error: line too long.\n");
return 1;
}
printf ("original: %s\n", buf); /* output the original string */
sum
,您可以提供可选的调试输出来帮助您解决算法中的任何问题,例如
for (; buf[ndx]; ndx++) { /* iterate over each character */
if (!isdigit (buf[ndx])) { /* validate character is digit */
fprintf (stderr, "error: non-digit '%c'.\n", buf[ndx]);
return 1;
}
sum += ((buf[ndx] - '0') * mult) % 10; /* increment sum by % 10 */
if (ndx + 1 == *pdx) { /* check if ndx+1 is position */
int ndigit = 0; /* no. of digits in sum */
char tmp[MAXC] = ""; /* tmp buffer for sum as string */
ndigit = sprintf (tmp, "%u", sum); /* write sum to tmp */
#ifdef DEBUG /* debug output */
printf ("ndx+1: %2d, sum: %3u, ndigits: %d\n",
ndx+1, sum, ndigit);
#endif
if (ndigit) /* validate characters written to tmp */
memcpy (&buf[ndx], tmp, ndigit); /* copy to buf */
pdx++; /* increment pos array index */
if (*pdx == npos) /* check if past last pos index */
break;
}
mult = (mult & 1) ? 2 : 1; /* toggle mult 2-1-2-1... */
}
printf ("revised : %s\n\n", buf); /* output updated number in buf */
}
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXC 512 /* constant for line-buffer size */
int main (int argc, char **argv) {
char buf[MAXC] = ""; /* buffer to read each line */
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read each line into buf */
int const pos[] = { 10, 21, 32 }, /* indexes to replace */
npos = sizeof pos / sizeof *pos; /* no. of indexes */
int ndx = 0, /* buffer index */
*pdx = (int *)pos, /* pointer to pos */
mult = 2; /* 2-1-2-... multiplier */
size_t len = strlen (buf); /* length of string */
unsigned sum = 0; /* sum of digits */
if (len && buf[len - 1] == '\n') /* check for trailing '\n' */
buf[--len] = 0; /* overwrite with nul-character */
else if (len == MAXC - 1) { /* otherwise string too long */
fprintf (stderr, "error: line too long.\n");
return 1;
}
printf ("original: %s\n", buf); /* output the original string */
for (; buf[ndx]; ndx++) { /* iterate over each character */
if (!isdigit (buf[ndx])) { /* validate character is digit */
fprintf (stderr, "error: non-digit '%c'.\n", buf[ndx]);
return 1;
}
sum += ((buf[ndx] - '0') * mult) % 10; /* increment sum by % 10 */
if (ndx + 1 == *pdx) { /* check if ndx+1 is position */
int ndigit = 0; /* no. of digits in sum */
char tmp[MAXC] = ""; /* tmp buffer for sum as string */
ndigit = sprintf (tmp, "%u", sum); /* write sum to tmp */
#ifdef DEBUG /* debug output */
printf ("ndx+1: %2d, sum: %3u, ndigits: %d\n",
ndx+1, sum, ndigit);
#endif
if (ndigit) /* validate characters written to tmp */
memcpy (&buf[ndx], tmp, ndigit); /* copy to buf */
pdx++; /* increment pos array index */
if (*pdx == npos) /* check if past last pos index */
break;
}
mult = (mult & 1) ? 2 : 1; /* toggle mult 2-1-2-1... */
}
printf ("revised : %s\n\n", buf); /* output updated number in buf */
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
return 0;
}
52
的一部分。即你在第 10 个字符处的替换是第一行的
5
。数字
2
和
sum
用作
'\'
的一部分插入第 21 个字符)
$ gcc -Wall -Wextra -pedantic -std=c11 -Ofast -DDEBUG \
-o bin/str_fill_sum_dbg str_fill_sum.c
bin
line-continuation 用于上面只是为了防止编译字符串滚动超出网页的右边距。此外,我将所有编译的可执行文件放在
bin/
子目录中,以保持我的源目录干净,您可以省略可执行文件名称的
DEBUG
部分)
$ ./bin/str_fill_sum_dbg <dat/sumdigits.txt
original: 34194716400003108771090006638210572088201000
ndx+1: 10, sum: 52, ndigits: 2
ndx+1: 21, sum: 79, ndigits: 2
ndx+1: 32, sum: 109, ndigits: 3
revised : 34194716452003108771790006638211092088201000
original: 34193716400000921121090006638390572088201000
ndx+1: 10, sum: 50, ndigits: 2
ndx+1: 21, sum: 68, ndigits: 2
ndx+1: 32, sum: 104, ndigits: 3
revised : 34193716450000921121680006638391042088201000
original: 34191718400000607281090006638470572088201000
ndx+1: 10, sum: 48, ndigits: 2
ndx+1: 21, sum: 69, ndigits: 2
ndx+1: 32, sum: 103, ndigits: 3
revised : 34191718448000607281690006638471032088201000
original: 34195718400000550361090006638540572088201000
ndx+1: 10, sum: 46, ndigits: 2
ndx+1: 21, sum: 59, ndigits: 2
ndx+1: 32, sum: 98, ndigits: 2
revised : 34195718446000550361590006638549872088201000
original: 34192719900000550361090006638620572088201000
ndx+1: 10, sum: 51, ndigits: 2
ndx+1: 21, sum: 64, ndigits: 2
ndx+1: 32, sum: 95, ndigits: 2
revised : 34192719951000550361640006638629572088201000
original: 34198721400000550361090006638700572088201000
ndx+1: 10, sum: 47, ndigits: 2
ndx+1: 21, sum: 62, ndigits: 2
ndx+1: 32, sum: 88, ndigits: 2
revised : 34198721447000550361620006638708872088201000
modulo
定义的定义以省略调试输出,如果您愿意,可以将可执行文件放在单独的文件名中,这样两者都可用:
$ gcc -Wall -Wextra -pedantic -std=c11 -Ofast \
-o bin/str_fill_sum str_fill_sum.c
$ ./bin/str_fill_sum <dat/sumdigits.txt
original: 34194716400003108771090006638210572088201000
revised : 34194716452003108771790006638211092088201000
original: 34193716400000921121090006638390572088201000
revised : 34193716450000921121680006638391042088201000
original: 34191718400000607281090006638470572088201000
revised : 34191718448000607281690006638471032088201000
original: 34195718400000550361090006638540572088201000
revised : 34195718446000550361590006638549872088201000
original: 34192719900000550361090006638620572088201000
revised : 34192719951000550361640006638629572088201000
original: 34198721400000550361090006638700572088201000
revised : 34198721447000550361620006638708872088201000
10
of Total 插入前
2
的结果取模 ojit_code ,而是想在插入前取总和的模,则可以用以下内容替换字符迭代循环:
for (; buf[ndx]; ndx++) { /* iterate over each character */
if (!isdigit (buf[ndx])) { /* validate character is digit */
fprintf (stderr, "error: non-digit '%c'.\n", buf[ndx]);
return 1;
}
sum += ((buf[ndx] - '0') * mult); /* increment by digit*mult */
if (ndx + 1 == *pdx) { /* check if ndx+1 is position */
int replace = sum % 10;
#ifdef DEBUG /* debug output */
printf ("ndx+1: %2d, sum: %3u, replace: %d\n",
ndx+1, sum, replace);
#endif
buf[ndx] = replace + '0'; /* replace char at buf[ndx] */
pdx++; /* increment pos array index */
if (*pdx == npos) /* check if past last pos index */
break;
}
mult = (mult & 1) ? 2 : 1; /* toggle mult 2-1-2-1... */
}
$ ./bin/str_fill_sum_dbg2 <dat/sumdigits.txt
original: 34194716400003108771090006638210572088201000
ndx+1: 10, sum: 52, replace: 2
ndx+1: 21, sum: 95, replace: 5
ndx+1: 32, sum: 145, replace: 5
revised : 34194716420003108771590006638215572088201000
original: 34193716400000921121090006638390572088201000
ndx+1: 10, sum: 50, replace: 0
ndx+1: 21, sum: 78, replace: 8
ndx+1: 32, sum: 145, replace: 5
revised : 34193716400000921121890006638395572088201000
original: 34191718400000607281090006638470572088201000
ndx+1: 10, sum: 48, replace: 8
ndx+1: 21, sum: 93, replace: 3
ndx+1: 32, sum: 157, replace: 7
revised : 34191718480000607281390006638477572088201000
original: 34195718400000550361090006638540572088201000
ndx+1: 10, sum: 56, replace: 6
ndx+1: 21, sum: 87, replace: 7
ndx+1: 32, sum: 146, replace: 6
revised : 34195718460000550361790006638546572088201000
original: 34192719900000550361090006638620572088201000
ndx+1: 10, sum: 61, replace: 1
ndx+1: 21, sum: 92, replace: 2
ndx+1: 32, sum: 148, replace: 8
revised : 34192719910000550361290006638628572088201000
original: 34198721400000550361090006638700572088201000
ndx+1: 10, sum: 57, replace: 7
ndx+1: 21, sum: 88, replace: 8
ndx+1: 32, sum: 141, replace: 1
revised : 34198721470000550361890006638701572088201000
关于c - 有没有办法从比 long long int 大的文件中读取数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50862699/
我找到了long int long和 int long long可以编译为变量类型。 long int long有什么区别吗, int long long , long long和 long long
我无法找出为什么“加密”函数仍然将“消息”读取为字符串,尽管我已经使用不同的方法将数据类型更改为字节。 错误消息是“Prince 类型中的方法 Encrypt(long, long, long, lo
这个问题在这里已经有了答案: Is "long long" = "long long int" = "long int long" = "int long long"? (4 个答案) 关闭 6 年
我正在从 Java 过渡到 C++,并且对 long 数据类型有一些疑问。在 Java 中,要保存大于 232 的整数,您只需编写 long x;。但是,在 C++ 中,long 似乎既是数据类型又是
clang-tidy 12.0.1 报告了一个相当奇怪的警告。在以下代码中: #include int main() { std::vector v1; const auto a =
我创建了一个 pair 和 long long int 的映射 - map,long long int >; 和一个交互器 - map, long long int >::iterator it1;
我想知道 unsigned long long 和 unsigned long long int 的主要区别。它们可以互换使用吗? 对于像 9223372036854775807 这样的大十进制数的计
我看到的大多数代码都使用缩写类型来声明变量,例如 long long x; // long long int x short y; // short int y 我浏览了 C++11 标准(第 3.9
common_type::type是 unsigned long因为关于积分提升后的操作数,标准说... [...] if the operand that has unsigned integer
long long int A = 3289168178315264; long long int B = 1470960727228416; double D = sqrt(5); long lon
这些新数据类型的目的是什么?我通常只使用“int”或“long”,但为什么会存在这些呢?它们带来了什么新功能或用途? 最佳答案 long int一直是long的全称,只是很少用而已。 long lon
我正在运行以下for循环 for(unsigned long long int i = N-1; i >= 0; i--){ cin>>L[i]; } 当程序到达这个代码段时,它停止响应。但是
最近问了一个关于递归导致这个问题的问题 注意-> count() 函数返回键 K 在 map 容器中出现的次数。如果键存在于容器中,则返回 1,因为映射仅包含唯一键。如果 map 容器中不存在键,则返
好的,所以我正在尝试实现客户端 - 服务器程序(套接字编程)。 我的客户发送一个嵌入字符串中的 long long int,如下所示: char copy[10]; sprintf(send_data
如果我有任务 Long c = a + b; 有没有一种简单的方法来检查 a + b 不大于/小于 Long.MAX_VALUE/Long.MIN_VALUE? 最佳答案 使用 Guava , 就这么
我需要制作一个 Comparator 来根据它的 long 类型的变量之一对我的对象列表进行排序。 public class ParticipantIndexComparator implements
假设我有这两种类型: typedef unsigned long long uint64; typedef signed long long sint64; 我有这些变量: uint64 a = ..
long long 和 long 有什么区别?而且它们都不适用于 12 位数字 (600851475143),我是不是忘记了什么? #include using namespace std; int
当结果将大于 C 中的 long long int 时,是否有可能对两个不同的 long long int 变量求和? 最佳答案 由于 OP 想要“在屏幕上打印结果”,因此将数字分成两部分:Most-
实际上我必须找到从源顶点到所有其他顶点的最短路径。为此,我获得了下面给出的代码模板。我想实现“Bellman–Ford algorithm”。 #include #include #include
我是一名优秀的程序员,十分优秀!