gpt4 book ai didi

c - 在列中添加整数值

转载 作者:行者123 更新时间:2023-11-30 19:33:05 25 4
gpt4 key购买 nike

我必须向行添加整数值。

  1. 我必须使用 strstr 函数找到字符串
  2. 从 string_1(COORDINATES)到 string_2(END_COORDINATES),我已将整数值添加到行中。
  3. 给我一些如何执行此操作的建议。

输入文件示例

COORDINATES  
5 10 20 30
5 10 20 30
5 10 20 30
5 10 20 30
5 10 20 30
5 10 20 30
5 10 20 30
5 10 20 30
END_COORDINATES
3 30 40 50
3 30 40 50
3 30 40 50
3 30 40 50
3 30 40 50

示例输出文件

COORDINATES  
5 110 220 330
5 110 220 330
5 110 220 330
5 110 220 330
5 110 220 330
5 110 220 330
5 110 220 330
5 110 220 330
END_COORDINATES
3 30 40 50
3 30 40 50
3 30 40 50
3 30 40 50
3 30 40 50

代码

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

FILE *file_input;
FILE *file_output;

#define COORDINATES "COORDINATES"
#define END_COORDINATES "END_COORDINATES"

int main(){
char line[256];
int SI_no, X_cord, Y_cord, Z_cord;

int change_in_X_cord, change_in_Y_cord, change_in_Z_cord;
int user_X_input, user_Y_input, user_Z_input;

user_X_input = 100;
user_Y_input = 200;
user_Z_input = 300;

///change in cordinates
change_in_X_cord = X_cord + user_X_input;
change_in_Y_cord = Y_cord + user_Y_input;
change_in_Z_cord = Z_cord + user_Z_input;

/// File input
file_input = fopen("File_output.domm", "r");
if (file_input == NULL)
{
perror("fopen");
exit(EXIT_FAILURE);
}
printf("%s \n " COORDINATES);

/// File output
file_output = fopen("File_output2.domm", "w");
if (file_output == NULL)
{
perror("fopen");
exit(EXIT_FAILURE);
}

printf("%s \n " END_COORDINATES);

while(fgets(line, sizeof(line),file_input)) {
if (!strstr(line, COORDINATES)){
continue;
}

if (!fgets(line, sizeof line,file_input)) {
return 3;
}

// pls give me suggestion how to perform this operation
/*
while(fscanf(file_input,"%d %d %d %d", &SI_no, &X_cord, &Y_cord, &Z_cord )) {
if (strstr(line, END_COORDINATES)){
return 0;
}
printf("%d %d %d %d \n", X_cord, Y_cord, Z_cord );
printf("%d %d %d %d", change_in_X_cord, change_in_Y_cord, change_in_Z_cord );
}
*/
}
}

最佳答案

如果我明白你在问什么,那就是“如何使用 strstr 来识别包含 “COORDINATES” 的行,然后对该行之后的行,直到到达包含“END_COORDINATES”的行,其余行保持不变。”

当您需要找出函数 man strstr 时,请从您总是开始的地方开始(或者如果您没有安装手册页 strstr(3) - Linux man page 。什么参数它需要什么?它返回什么?(“指向子字符串开头的指针,如果未找到子字符串,则返回 NULL”)

为了在代码中使用返回进行比较,最好保存它,例如

...
while (fgets (buf, MAXC, fp)) {
char *p = buf;
/* does buf contain "COORDINATES"? */
if ((p = strstr (buf, "COORDINATES"))) {
...

所以您已经阅读了每一行并找到了“COORDINATES”。考虑到保存在 p 中的 strstr 的返回值,如何测试 buf 是否以 "COORDINATES" 开头?

如果 buf"COORDINATES" 开头,p 将指向哪里? (回想一下返回:“指向子字符串开头的指针”)如果 bufp 都指向 “COORDINATES” ,那么您就找到了行“COORDINATES”

如果 buf 包含 "COORDINATES",但不是以它开头(例如 p != buf),那么您就找到了 “END_COORDINATES”

如何知道您是否已找到“COORDINATES”,但尚未遇到“END_COORDINATES”?最简单的方法是在遇到 "COORDINATES" 时设置一个类似 int coords = 1 的标志,并将其设置为 0 “END_COORDINATES”。然后您需要做的就是检查 if (coords) {/* do stuff to rows */}。示例:

    int coords = 0;     /* flag indicating between tags */
...
while (fgets (buf, MAXC, fp)) { /* read each line */
char *p = buf;
/* does buf contain "COORDINATES"? */
if ((p = strstr (buf, "COORDINATES"))) {
if (p == buf) { /* does buf begin with it? */
printf ("start mod of rows.\n");
coords = 1; /* set flag */
}
else { /* contains, but doesn't begin with */
printf ("end mod of rows.\n");
coords = 0; /* unset flag */
}
}
else if (coords) /* flag set, modify rows */
printf ("modify: %s", buf);
}
...

将各个部分放在一个示例中,展示如何使用 strstr 来标识要修改的行(其余的由您决定),您可以执行如下操作:

#include <stdio.h>
#include <string.h>

#define MAXC 512

int main (int argc, char **argv) {

char buf[MAXC] = "";
int coords = 0; /* flag indicating between tags */
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 */
char *p = buf;
/* does buf contain "COORDINATES"? */
if ((p = strstr (buf, "COORDINATES"))) {
if (p == buf) { /* does buf begin with it? */
printf ("start mod of rows.\n");
coords = 1; /* set flag */
}
else { /* contains, but doesn't begin with */
printf ("end mod of rows.\n");
coords = 0; /* unset flag */
}
}
else if (coords) /* flag set, modify rows */
printf ("modify: %s", buf);
}

if (fp != stdin) fclose (fp); /* close file if not stdin */

return 0;
}

示例使用/输出

$ ./bin/coords dat/coords.txt
start mod of rows.
modify: 5 10 20 30
modify: 5 10 20 30
modify: 5 10 20 30
modify: 5 10 20 30
modify: 5 10 20 30
modify: 5 10 20 30
modify: 5 10 20 30
modify: 5 10 20 30
end mod of rows.

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 在列中添加整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com