[英]How can I read from stdin until new line in groups of 16 bytes?
我需要一个代码来使用 function 从 stdin 读取直到有一个换行符,然后使用该行。 问题是我不能只读取字符并将它们放入数组中,直到我读取“\n”,因为练习需要一次最多读取 16 个字节。
我尝试使用 function strtok 来使用分隔符“\n”来划分行,但它没有按我想要的那样工作,所以有没有什么方法只能读取直到它检测到“\n”? 我也需要它不断地阅读它。
这是我现在拥有的:
void readline(char *buf, unsigned buf_size){
ssize_t num_read;
while((num_read = read(STDIN_FILENO,buf,buf_size)) > 0){
}
}
然后在主function:
while(i == 0){
readline(buf,BUF_SIZE);
token1 = strtok(buf,"\n");
while(token1 != NULL){
orden->num=0;
token2 = strtok(token1, " ");
orden->args[orden->num] = token2;
while(token2 != NULL){
if(token2!=NULL) {
orden->num+=1;
orden->args[orden->num] = token2;
}
}
orden->num+=1;
orden->args[orden->num] = NULL;
insertar_final(lista,orden);
token1 = strtok(NULL,"\n");
};
...
其他使用“”的 strtoks 声明用于我的代码需要的其他东西,但那是有效的,所以不要介意它们。
从您的代码中,忘记 16 字节的东西。
您只是想存储一组由空格分隔的单词(例如空格和/或换行符)。 单词可能 [最多] 16 个字节,但这并不重要。
使用fgets
。 它不会去除换行符。
您的问题是缓冲区在每一行上重复使用。 因此(例如),在读取的第二行中,它会覆盖第一行中的单词。
您需要使用strdup
来保存每个令牌的唯一副本。
改变:
orden->args[orden->num] = token2;
进入:
orden->args[orden->num] = strdup(token2);
这是一些重构代码:
char buf[128 + 1];
while (fgets(buf,sizeof(buf),stdin) != NULL) {
// save off all whitespace separated tokens
char *tok = strtok(buf," \n");
while (tok != NULL) {
orden->args[orden->num++] = strdup(tok);
tok = strtok(NULL," \n");
}
// add NULL terminator
orden->args[orden->num] = NULL;
// add line to list of lines
insertar_final(lista,orden);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.