- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基本的 C 代码,旨在通过打开文件、读取内容和关闭文件来读取文件的内容。尽管以下代码可以编译并运行,但 clang 编译器会给出一些额外的警告,我无法解决这些警告。
#include <stdio.h>
char* scanFile(FILE *fl, char* ch);
int main(int argc, char const* argv[])
{
FILE *file;
char *ch = "\0";
ch = scanFile(file, ch);
fclose(file);
printf("%s\n", ch);
return 0;
}
char* scanFile(FILE *fl, char* ch)
{
fl = fopen("/tmp/test.txt", "r");
if (fl)
{
while ((ch = getchar()) != EOF) { putchar(ch); }
}
return ch;
}
当我尝试编译代码时,我的 clang 会闪烁以下警告。
clang scanFile scanFile.c
scanFile.c:22:20: warning: incompatible integer to pointer conversion assigning to 'char *'
from 'int' [-Wint-conversion]
while ((ch = getchar()) != EOF) { putchar(ch); }
^ ~~~~~~~~~
scanFile.c:22:33: warning: comparison between pointer and integer ('char *' and 'int')
while ((ch = getchar()) != EOF) { putchar(ch); }
~~~~~~~~~~~~~~~~ ^ ~~~
scanFile.c:22:51: warning: incompatible pointer to integer conversion passing 'char *' to parameter of type 'int' [-Wint-conversion]
while ((ch = getchar()) != EOF) { putchar(ch); }
^~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/stdio.h:172:17: note: passing argument to parameter here
int putchar(int);
^
3 warnings generated.
ld: can't link with a main executable file 'scanFile' for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
但是,由于编译过程没有任何严重错误,因此当我运行上述编译结果生成的可执行文件时,我在屏幕上看到以下内容(以下人造拉丁语是应该是的文件)在我的 C 代码中读取并输出。)
Ergo ego senator inimicus, si ita vultis, homini, amicus esse, sicut semper fui, rei publicae debeo.
Quid? si ipsas inimicitias, depono rei publicae causa, quis me tandem iure reprehendet, praesertim cum ego omnium meorum consiliorum atque factorum exempla semper ex summorum hominum consiliis atque factis mihi censuerim petenda.
Eodem tempore etiam Hymetii praeclarae indolis viri negotium est actitatum, cuius hunc novimus esse textum.
Cum Africam pro consule regeret Carthaginiensibus victus inopia iam lassatis, ex horreis
Romano populo destinatis frumentum dedit, pauloque postea cum provenisset segetum copia, integre sine ulla restituit mora.
Et hanc quidem praeter oppida multa duae civitates exornant Seleucia opus Seleuci regis, et Claudiopolis quam deduxit coloniam Claudius Caesar.
Isaura enim antehac nimium potens, olim subversa ut rebellatrix interneciva aegre vestigia claritudinis pristinae monstrat admodum pauca.
[1] 59823 segmentation fault ./scanFile
注意:但它仍然给出“59823段错误./scanfile”错误。
额外:clang -Wall 给出;
C clang -Wall scanFile.c
scanFile.c:10:19: warning: variable 'file' is uninitialized when used here [-Wuninitialized]
ch = scanFile(file, ch);
^~~~
scanFile.c:7:15: note: initialize the variable 'file' to silence this warning
FILE *file;
^
= NULL
scanFile.c:22:20: warning: incompatible integer to pointer conversion assigning to 'char *' from 'int' [-Wint-conversion]
while ((ch = getchar()) != EOF) { putchar(ch); }
^ ~~~~~~~~~
scanFile.c:22:33: warning: comparison between pointer and integer ('char *' and 'int')
while ((ch = getchar()) != EOF) { putchar(ch); }
~~~~~~~~~~~~~~~~ ^ ~~~
scanFile.c:22:51: warning: incompatible pointer to integer conversion passing 'char *' to parameter of type 'int' [-Wint-conversion]
while ((ch = getchar()) != EOF) { putchar(ch); }
^~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/stdio.h:172:17: note: passing argument to parameter here
int putchar(int);
^
4 warnings generated.
最佳答案
Ahmet 你的代码中有一些错误:
char *ch = "\0";
那样定义字符串时,它被称为字符串文字
。尝试修改字符串文字是未定义的行为。您可以在 here 阅读有关字符串文字的更多信息。 。这会给你带来段错误。scanFile
函数,以便在函数完成时关闭文件。但是,当您将文件指针传递给 scanFile
函数时,它是按值传递的。编译器警告您在传递它之前没有初始化它。当 scanFile
函数打开文件并将生成的文件指针分配给其参数时,无法在函数外部访问该文件。您必须返回一个文件指针才能执行此操作。getchar
从文件中读取字符。它用于从stdin
获取字符。默认情况下它从键盘获取字符。您应该使用 fgetc
从文件中获取字符。这里是一个工作示例,已更新,用于检查 errno
是否可能出现 malloc
或 fopen
失败:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#define MAX_BUFFER_SIZE 1000
struct {
FILE *fPtr;
char *text;
} typedef Result;
Result scanFile(const char *fileName);
int main(int argc, char const* argv[]) {
Result result = scanFile("text.txt");
printf("Result:\n%s\n", result.text);
return 0;
if (errno != 0) {
printf("Program ended with error: %d\n", errno);
return -1;
}
printf("Result:\n%s\n", result.text);
// Close the file
fclose(result.fPtr);
// Free buffer
free(result.text);
return 0;
}
Result scanFile(const char *fileName) {
Result result;
result.text = (char *)malloc(sizeof(char)*MAX_BUFFER_SIZE);
if (result.text == NULL) {
printf("scanFile: Faield to allocate memory!\n");
printf("scanFile: %s\n", strerror( errno ));
return result;
}
result.fPtr = fopen(fileName, "r");
if (result.fPtr == NULL) {
printf("scanFile: Faield to open file!\n");
printf("scanFile: %s\n", strerror( errno ));
return result;
}
unsigned int count = 0;
int ch;
while ((ch = fgetc(result.fPtr)) != EOF) {
if (count < MAX_BUFFER_SIZE) {
result.text[count] = ch;
++count;
} else {
printf("scanFile: Exceeded buffer size!\n");
break;
}
}
return result;
}
关于c - 解决简单 C 扫描器中的 clang 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60256989/
我是编程初学者(学习Java)。我正在尝试编写一个程序,其中列出了四个不同的选项供用户选择。 这是其中的一部分: import java.util.*; public class fight
这个问题已经有答案了: nextDouble() throws an InputMismatchException when I enter a double (2 个回答) 已关闭 8 年前。 我的
为什么下面的代码返回 false? Scanner sc = new Scanner("-v "); sc.useDelimiter("-[a-zA-Z]\\s+"); System.out.prin
我这里有一个由两部分组成的问题。因此,我正在为一个作业编写代码,尝试从文本文件中读取整数作为坐标。例如,我有一个标题为 test1 的文本文件,其内容如下:50 00 510 53 310 0。现在,
当我尝试通过单步执行每一行来调试简单的 Java 代码时,我可以成功调试它。但是,如果我通过进入每一行来调试它,我最终会得到“找不到源”。 import java.util.*; public
我正在尝试接受一个字符串输入,该输入由多行以“,”和“;”分隔的数字组成. 示例: 1,2;3,4;5,6; 9,8;7,6; 0,1; ; 代码: ArrayList alist = new Arr
我想问一个关于我的代码的问题。 对于它的低效和困惑我深表歉意,我还在努力学习java。 System.out.println("Please choose the number corresp
现在选择菜单上的每个选项都可以正常工作(感谢 Tarek Salah 和 dasblinkenlight 的帮助)。现在的问题是,当我选择一个需要我输入新单词的选项(例如选项 3,用户必须输入歌曲名称
我有一个数据文件,其中多个连续行上有斜杠分隔的整数。 这是我想用来读取和打印所有这些整数的一小段代码: import java.util.Scanner; import java.io.File; c
这个问题在这里已经有了答案: Scanner class skips over whitespace (5 个答案) 关闭 7 年前。 我做了一个简单的程序,允许用户输入一个名字然后问候他。 imp
我想使用手写的降序解析器来解析一些文本。我使用了带有以下分隔符的 Scanner:"\\s*"。不幸的是,这个模式匹配一个空字符串的事实似乎让每个 hasNextFoo 和 nextFoo 都不再
Stackoverflow,你好。我无法理解这段代码的输出 public static void main (String[] args) { String context = "0100 5
我需要编写一个java程序,获取所有计算机网络接口(interface)并扫描子网内的IP地址和MAC地址。 我不太确定该怎么做,但我发现有一个方法叫做: Arping.scan(deviceName
Sonar 提示 Scanner 应该一直关闭,对吗? Scanner scanner = new Scanner("simple string") 此扫描仪不是从文件等扫描。为什么要关闭它? 最佳答
我正在使用 Java Scanner 对象来解析文本文件。我需要扫描部分文件两次(出于性能原因,这样我就不必临时存储其内容)。 因此,是否有一种方法可以将扫描仪“倒回”到特定文件位置? 或者,有没有一
我正在为我的一门类(class)做一个实验室,因此我更多地是在寻找解释而不是实际代码。 对于此作业的一部分,我需要从用户那里读取数字,直到按下 control-d。我在一个方法中有一个 while 循
我正在尝试构建一个程序,我想在其中输入(使用扫描仪)一些数字,例如 5,3,6,65,33,1,24,12,然后使用 2 个线程打印它们。第一个线程将打印从低到高,第二个线程将打印从高到低。我将在这里
我编写了一段简短的 Java 代码来计算用户使用 Scanner 输入的两个整数的乘积。用户被迫输入整数值。代码如下所示。 import java.util.Scanner; public class
我在我的 java 项目中遇到以下异常。 Exception in thread "main" java.util.NoSuchElementException at java.util.Sc
我有一串 float ,例如 1.0000\0.0000\0.0000\0.00000\1.0000\0.0000\0.0000 我需要解析它。我使用 Java 扫描仪并使用反斜杠作为分隔符。它已经以
我是一名优秀的程序员,十分优秀!