memset() 在 while(fgets) 之后
memset() after while(fgets)
我的程序应该从 stdin 读取并将输入移交给系统 - 以防输入不等于 "exit"。
除非第二个输入比第一个长,否则这非常有效。
例如,如果第一个输入是 "hello",第二个是 "hellohello",则输入将拆分为 "hello" 和 "ello"。
我想问题是循环时 buffer 没有被正确清除。因此我使用了 memset()
但不幸的是我没有得到我想要的结果。
谁能看出错误?
非常感谢!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
int main(){
char *s = (char *)malloc(MAX);
char *temp = NULL;
while(fgets(s, (sizeof(s)-1), stdin)!= NULL){
temp = s+(strlen(s)-1);
*temp = '[=10=]';
if (strcmp(s,"exit")==0){
break;
} else {
system(s);
}
memset(s, 0, MAX);
}
free(s);
return 0;
}
这里不正确的是(sizeof(s)-1)
。这不会 return 分配缓冲区的大小,而是 return (char*)
的大小。您的缓冲区大小是 MAX
。 memset()
确实对此没有任何作用,因此将其删除。如果您不需要这样做 -1
,fgets()
将始终自动在字符串末尾附加零终止符,即使缓冲区已满。
还有这两行
temp = s+(strlen(s)-1);
*temp = '[=10=]';
不需要,因为
“fgets()
从流中读取最多一个小于 size 的字符,并将它们存储到 s
指向的缓冲区中。读取在 EOF
或换行符后停止。如果读取换行符, 它被存储到缓冲区中。一个终止空字节 (aq[=29=]aq) 存储在缓冲区中最后一个字符之后。"
(来自"man fgets",google为之)
我的程序应该从 stdin 读取并将输入移交给系统 - 以防输入不等于 "exit"。
除非第二个输入比第一个长,否则这非常有效。
例如,如果第一个输入是 "hello",第二个是 "hellohello",则输入将拆分为 "hello" 和 "ello"。
我想问题是循环时 buffer 没有被正确清除。因此我使用了 memset()
但不幸的是我没有得到我想要的结果。
谁能看出错误?
非常感谢!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
int main(){
char *s = (char *)malloc(MAX);
char *temp = NULL;
while(fgets(s, (sizeof(s)-1), stdin)!= NULL){
temp = s+(strlen(s)-1);
*temp = '[=10=]';
if (strcmp(s,"exit")==0){
break;
} else {
system(s);
}
memset(s, 0, MAX);
}
free(s);
return 0;
}
这里不正确的是(sizeof(s)-1)
。这不会 return 分配缓冲区的大小,而是 return (char*)
的大小。您的缓冲区大小是 MAX
。 memset()
确实对此没有任何作用,因此将其删除。如果您不需要这样做 -1
,fgets()
将始终自动在字符串末尾附加零终止符,即使缓冲区已满。
还有这两行
temp = s+(strlen(s)-1);
*temp = '[=10=]';
不需要,因为
“fgets()
从流中读取最多一个小于 size 的字符,并将它们存储到 s
指向的缓冲区中。读取在 EOF
或换行符后停止。如果读取换行符, 它被存储到缓冲区中。一个终止空字节 (aq[=29=]aq) 存储在缓冲区中最后一个字符之后。"
(来自"man fgets",google为之)