C scanf() 不读取整行
C scanf() does not read full line
我想为家庭作业创建文本清理器,但是当我使用地址清理器启动程序时,即使我使用 free()
.
,我也有 heap-buffer-overflow
异常
预期输出:
he3llo world
helloworld
实际输出:
he3llo world
hello
提前感谢您的回答!
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char* fix_text(char* data, int len)
{
char* fixed_message = malloc (len * sizeof(char));
int offset = 0; //used for correct parse
for (int i = 0; i < len; i++)
{
if (isalpha(data[i]))
{
fixed_message[offset] = data[i];
offset++;
}
else if(data[i] == '[=12=]')
{
break;
}
else if(data[i] == ' ')
{
continue;
}
}
return fixed_message;
}
int main()
{
char * text = malloc(100 * sizeof(char));
scanf("%s", text);
char* result = fix_text(text, 100);
printf("%s\n", result);
free(text);
free(result);
return 0;
}
您的代码仅输出 hello
的问题与循环停止无关。这是因为您的 scanf
只读到 space。所以你传递给函数的字符串 text
基本上只是 hello
。
您可以使用
来解决这个问题
scanf("%[^\n]s",text);
一直读到换行。有关详细信息,您可以查看
this question
正如@Jabberwocky 所指出的,您并没有终止您的固定消息。当您在原始消息中遇到相同的内容时,您可以在固定消息的末尾添加空终止符 [=16=]
而不仅仅是 breaking
else if(data[i] == '[=11=]')
{
fixed_message[offset] = data[i];
break;
}
我想为家庭作业创建文本清理器,但是当我使用地址清理器启动程序时,即使我使用 free()
.
heap-buffer-overflow
异常
预期输出:
he3llo world
helloworld
实际输出:
he3llo world
hello
提前感谢您的回答!
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char* fix_text(char* data, int len)
{
char* fixed_message = malloc (len * sizeof(char));
int offset = 0; //used for correct parse
for (int i = 0; i < len; i++)
{
if (isalpha(data[i]))
{
fixed_message[offset] = data[i];
offset++;
}
else if(data[i] == '[=12=]')
{
break;
}
else if(data[i] == ' ')
{
continue;
}
}
return fixed_message;
}
int main()
{
char * text = malloc(100 * sizeof(char));
scanf("%s", text);
char* result = fix_text(text, 100);
printf("%s\n", result);
free(text);
free(result);
return 0;
}
您的代码仅输出 hello
的问题与循环停止无关。这是因为您的 scanf
只读到 space。所以你传递给函数的字符串 text
基本上只是 hello
。
您可以使用
scanf("%[^\n]s",text);
一直读到换行。有关详细信息,您可以查看 this question
正如@Jabberwocky 所指出的,您并没有终止您的固定消息。当您在原始消息中遇到相同的内容时,您可以在固定消息的末尾添加空终止符 [=16=]
而不仅仅是 breaking
else if(data[i] == '[=11=]')
{
fixed_message[offset] = data[i];
break;
}