【问题标题】:C4477 - format string '%s' requires type 'char *', but variadic argument 1 has type 'int'C4477 - 格式字符串“%s”需要类型“char *”,但可变参数 1 的类型为“int”
【发布时间】:2016-10-01 05:32:50
【问题描述】:

我已经跟踪论坛一个多月了,它可以回答我的大部分问题。但是我一直在努力解决一个我在这里找不到答案的困难(还有其他类似的解决方案,但它并没有解决我的问题)

我已尝试将我庞大的代码块简化为如下所示,

#define DATA_ROW 1 /*I have one data per line*/


int freqstring;
char objectstring;
char string[10];
FILE * file;


freqstring = 0;
while (fscanf_s(file, "%s", &objectstring, 8) == DATA_ROW)
{
    string[freqstring] = objectstring;
    freqstring = freqstring + 1;
}

for (freqstring = 0; freqstring < 10; freqstring = freqstring + 1)
{
    printf("%s", string[freqstring]);
}

现在开始学习 C 编程两个多月了,这是我第一次使用数组。我在输出框中遇到了以下错误消息

警告 C4477:“printf”:格式字符串“%s”需要“char *”类型的参数,但可变参数 1 的类型为“int”

【问题讨论】:

  • "%s", string[freqstring]) - 这里缺少一些东西......
  • 错误很明显:您声称要打印“字符串”,即 char 数组或 char 指针。您提供的参数是一个字符。不是数组,也不是指针。
  • 我已更正所有错别字。 @SamiKuhmonen,但没有将我的它声明为 'char string[10]' 使它成为一个数组,名称为字符串,大小为 10?如果我的问题对你来说听起来很愚蠢,我很抱歉。
  • 是的,但是您没有将 string 提供给 printf,而是将 string[freqstring] 提供给该数组中的单个字符。
  • 看起来我在这里错过了一些重要的东西。当我进行 for 循环和 printf string[freqstring] 时,难道不是意味着我将打印该数组中的每个元素同时增加 1 吗?

标签: c


【解决方案1】:

你对字符串的概念有些误解。

字符串是一个以零结尾的字符数组。该字符串中的单个字符仍然是整数类型。

所以string[freqstring] 具有整数类型。这正是错误消息所说的。由于使用了%sprintf 需要一个 char* 类型(又名字符串),但你给它一个整数类型。

要获取字符串,只需使用string,即

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

此外,您的扫描似乎有问题:

fscanf_s(file, "%s", &objectstring, 8)

您要求一个字符串 (%s),但 objectstring 只是一个 char。您声称尺寸为 8,但事实并非如此。使用sizeof 而不是常量。

您是否真的打算读取字符,然后使用 %c 而不是 %s

如果您想读取字符,代码可能类似于:

freqstring = 0;
string[freqstring] = '\0';
while ((fscanf_s(file, "%c", &objectstring, sizeof(char)) == 1) &&
       (freqstring < 9))
{
    string[freqstring] = objectstring;
    freqstring = freqstring + 1;
    string[freqstring] = '\0';
}

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

【讨论】:

  • 我知道 '\0' 终止了字符串。但我还有其他问题,while 循环中的第三行到底是什么意思?它是否在我扫描的字符行后面添加了一个“\0”?为什么我不需要在第二部分执行 for 循环?是因为你这样做的方式是把所有的东西都认为是一个字符串吗?你所要做的就是打印那个字符串?
  • 哦,顺便说一句,我最初的计划是创建一个非常大的文本文件,每行包含单词和数字,即 work 10。所以我不认为逐个字符对我来说是最好的方法,因为我的计划是 fscanf_s %s %d 并将其存储到一个数组中,这样我就可以慢慢排列和分析该数组中的元素。
  • @AndrewWong - 对于您的第一条评论:正确,第三行添加了字符串所需的零终止符。然后,您可以一次打印整个字符串。这就是%s 的全部意义所在,即继续打印字符直到达到零终止。所以不需要你的第二个循环。您可以使用第二个循环,但在这种情况下,您应该使用 %c 而不是 %s 打印一个字符。
  • @AndrewWong - 第二条评论:我会使用 fgets 将整行读入字符串。之后,我会将字符串分解为一个单词和一个值,我将它们存储在一个结构(或者更确切地说是结构的数组)中。但这是一个新问题,你可以问。希望以上回答对您有所帮助。
  • 你如何将一个单词和一个值(我假设它是数组的一个元素?)分成一个字符串(我一直假设一个单词的数据类型是字符串,纠正我如果我错了)和一个整数? 我的教授说他没有教我们结构体的使用,我们可以使用它,但是如果我们的结构体布局有缺陷,我们将比数组有缺陷相对更明显只要。他提到我们的任务只能用数组来解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多