我已经将这个函数解决了导致问题的原因,但是我会尝试为这个问题提供足够的上下文,而不会让你仔细阅读文本的行和行:
基本上,我在下面的函数中输入一个字符串,如果字符串中的第一个字符是#,那么我想打印字符串。就是这样。
但是,执行此操作时,打印的字符串将以三个字符的长度剪切。例如,输入字符串为“ #Hello,World!”的地方只会打印“ #H ”。
我使用以下输入文件中的fgets()获取输入字符串:
#测试
#######
#更多
输出如下:
#T
###
###
#
#M
以下是相关的修剪功能:
int main(int argc,char *argv[]){
FILE *input;
lineResponse response;
//If a filename was specified, the file exists, and it is openable
if(argv[1] != NULL && (input = fopen(argv[1],"r")) != NULL){
char *currentLine = "";
//Loop through the lines
while(fgets(currentLine,sizeof(input),input)){
response = parseLine(currentLine);
}
}
fclose(input);
getchar();
}
lineResponse parseLine(char *line){
lineResponse response = {0,NULL}; //0 is the default lineType, denoting a line that cannot be parsed
if(line != NULL){
if(line[0] == '#'){
printf("%s\n",line);
}
}
return response;
}
lineResponse返回与此问题无关。什么可能导致修剪?如果您需要更广泛的示例,我可以提供一个。
答案 0 :(得分:6)
char *currentLine = "";
//Loop through the lines
while(fgets(currentLine,sizeof(input),input)){
这是你的问题。您正在声明一个char指针并为其指定一个字符串文字...然后尝试读入它。你似乎也不理解fgets
的第二个论点;它读取的字符数少于该字符数,并使用\0
终止缓冲区。另请注意,换行符存储在缓冲区中,如果您不想要它们,则需要将其删除。
这应该是:
char currentLine[1024]; /* arbitrary - needs to be big enough to hold your line */
while(fgets(currentLine,1024,input)) {
字符串文字(例如char* = "This is a string literal"
)是不可变的(只读)。它们是在编译时创建的。
答案 1 :(得分:4)
问题必须在于你如何阅读这条线。由于您评论您正在阅读fgets()
,我将猜测您是在32位计算机上,并且您有一些类似的代码:
char buffer[128];
if (fgets(&buffer, sizeof(&buffer), stdin))
{
lineResponse r = parseLine(buffer);
...
}
还有其他类似的技巧:
char *buffer;
if (fgets(buffer, sizeof(buffer), stdin))
...
这里发生的是你向fgets()
提供了错误的大小(和错误的地址),并且它的总大小为4,这意味着它只能存储3个字符加上终止的NUL '\0'
。
正确的代码可能是:
char buffer[128];
if (fgets(buffer, sizeof(buffer), stdin))
{
lineResponse r = parseLine(buffer);
...
}
或者:
char *buffer = malloc(2048);
// error check memory allocation!
if (fgets(buffer, 2048, stdin))
...
您的代码显示为:
char *currentLine = "";
//Loop through the lines
while(fgets(currentLine,sizeof(input),input)){
response = parseLine(currentLine);
这确实对应于(或多或少)我假设的char *buffer;
版本。您在sizeof(input)
声明FILE *input;
时使用currentLine
进行了额外调整。如果将char *
保留为 char currentLine[2048];
//Loop through the lines
while (fgets(currentLine, sizeof(currentLine), input))
{
response = parseLine(currentLine);
...
}
,或者(更简单,因为没有动态分配的内存泄漏),您需要调整我的第二个建议替代方案,使用:
{{1}}