【问题标题】:Passing input string to a function in C将输入字符串传递给C中的函数
【发布时间】:2021-12-16 02:09:41
【问题描述】:

我想实现以下目标: 我必须在具有以下结构的文件(例如txt)中管理数据库:X,X,X,X,X 在这个数据库中,我希望能够修改一行,当我在代码中编写要更改的行时,它可以完美地工作。 但是我希望能够在运行程序期间编写该行。 重要提示:当你写一个行值时,你必须放一个 .到最后不过那。不会进入文件。 此外,您不知道输入的长度。 这有效: 在 Main 中,值是预先给出的:

char file[50];
scanf("%s",file);
char tmp[]="temp.txt";
char a[]="2,2,2,2,2";
char b[]="9,9,9,9,9";
javitas(file,tmp,a,b);  // this will modify the line a to b in the file

程序:

#define sorhossz 500
void javitas(char filename1[], char filename2[], const char *str, const char *replace) {
    FILE *in = fopen(filename1,"r+");
    FILE *out = fopen(filename2,"w+");
    size_t strl;
    char line[sorhossz];
    strl = strlen(str);
    while (fgets(line, sizeof(line), in)) {
        char *y, *x = line;
        while ((y = strstr(x, str))) {
            fwrite(x, 1, y - x, out);
            fputs(replace, out);
            x = y + strl;
        }
        fputs(x, out);

    }

    rewind(out);
    rewind(in);
    while (fgets(line, sizeof(line), out))
    {
        char *x = line;
        fputs(x, in);
    }
    fclose(in);
    fclose(out);
}

但我想在运行期间以某种方式在 Main 中给出“a”和“b”:

char a[50]; // 50 is a random number I was triing with
char b[50];
printf("Give the line you want to modify\n");
scanf("%[^.]%*c",a);
printf("Give the line you want to modify to\n");
scanf("%[^.]%*c",b);
javitas(file,tmp,a,b);

当我尝试从输入中给出值时,我会写“2,2,2,2,2”。对于 a 和“9,9,9,9,9”。对于 b。别忘了 .是不成串。之后,我可以在程序中打印这些字符串,所以我猜程序理解输入值,但是它不会将文件中的“a”行修改为“b”行。 你能帮忙吗?

这是一个我正在测试的文件:(我将其命名为 qqq.txt 但没关系)

9,9,9,9,9
hel,az,de,5,k
0
ennyi,annyi,amannyi,helo,ot 22

1,2,3,4,5

1,2,2,2,3

ez,az vegre, sikerult, 3 sort illeszteni, a fileba

peti,egy,kiraly,helo,5om, 5 helo 5, 5 ezaz
egy,ketto,harom,negy,ot
helo,helo,lusta,vagyok,irni
meg,egyszer,hatha,most,sikerul
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,1,1,1,1
2,2,2,3,3
helo,belo,ize,de,4

如果文本文件没有退出,它将在菜单之前创建。 很抱歉在这里和那里都是匈牙利人,但我希望主要的事情是可以理解的。

【问题讨论】:

  • “但这根本不起作用” 这为猜测这可能意味着什么留下了相当大的空间。请具体说明什么不起作用。你提供什么作为输入,你期望什么,你会得到什么?
  • 您的问题是关于将字符串传递给函数,但在将输入字符串传递给函数之前,您是否确认输入字符串看起来正常?
  • @Gerhardh 当我尝试从输入中给出值时,我写“2,2,2,2,2”。对于 a 和“9,9,9,9,9”。对于 b。别忘了 .是不成串。之后,我可以在程序中打印这些字符串,所以我猜程序理解输入值,但是它不会将文件中的“a”行修改为“b”行。
  • 请将此重要信息添加到问题中,而不是在 cmets 中。
  • 如果我理解正确,如果您将字符串定义为 main 中的文字,但如果您使用来自用户输入的字符串则不行。这意味着在将值传递给您的函数时出现问题的可能性极小。你的输入有问题。您是在 a 和 b 之后按 enter 还是将两者都添加到同一行?在第一种情况下,我希望您在b 中有一个领先的\n

标签: c string input char


【解决方案1】:

当我尝试从输入中给出值时,我写 "2,2,2,2,2."a

评论scanf("%[^.]%*c",a);

这个和之前的scanf() 调用不会消耗输入行的尾随'\n',所以在这种情况下a 变为"\n2,2,2,2,2"

一个简单的修复方法是使用scanf(" %[^.]%*c",a);(注意空格)来消耗像'\n' 这样的前导空格。

更好的代码会使用宽度限制,扫描'.' 并检查结果,也许是'\n'

char a[50];
if (scanf(" %49[^.].%*1[\n]",a) == 1) Success(); else Fail();

更健壮的代码根本不会使用scanf(),而是使用fgets() 读取用户输入line,然后处理字符串


可能存在其他问题。

【讨论】:

  • scanf 中的空间成功了!非常感谢!
  • @Frank 以防万一:您不应该只占用空间,还要占用长度指示器。这不仅可以解决您当前的头痛问题,还可以解决未来可能出现的头痛问题。
猜你喜欢
  • 1970-01-01
  • 2013-05-21
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
相关资源
最近更新 更多