我的程序有问题。我在无限循环中从标准输入读取它工作正常,但是当我将超过 4096 个字符放入标准输入时,它开始表现不佳,我真的不知道为什么。 getc 是否有限?我将把你的输入和输出放在这里
#define NFDS 1
#define h_addr h_addr_list[0]
#define BUFFER_LEN 4096
void *sending(void *arguments)
{
struct arg_struct *args = arguments;
int i = 0, j = 1;
if(signal(SIGINT, receive_signal) == SIG_ERR) {
fprintf(stderr, "Error setting signal handler for SIGINT.\n");
}
fd_set myset;
struct timeval tim;
int result;
int data_cap = 4096;
while(running)
{
tim.tv_sec = 0;
tim.tv_usec = 500;
FD_ZERO(&myset);
FD_SET(STDIN_FILENO, &myset);
result = select(STDIN_FILENO + 1, &myset, NULL, NULL, &tim);
if(result != 0)
{
str = calloc(data_cap,sizeof(char));
while((c = getc(stdin)) != '\n')
{
if (j >= data_cap)
{
str = realloc(str,sizeof(char) * data_cap * 2);
data_cap = data_cap * 2;
}
str[i] = c;
i++;
j++;
}
if (j >= data_cap)
{
str = realloc(str,sizeof(char) * data_cap * 2);
}
str[i] = '\0';
if(strlen(str)!=0)
{
bufferIn = message(args->arg2,str);
if(send(args->arg1,bufferIn,strlen(bufferIn),0) < 0)
{
callError("ERROR: cannot send socked");
}
free(bufferIn);
}
free(str); i = 0; j = 1; data_cap = 4096;
}
}
return NULL;
}
//in main threads
struct arg_struct args;
args.arg1 = client_socket;
args.arg2 = username;
pthread_t t22;
pthread_t t11;
pthread_create(&t22, NULL, &sends, (void *)&args);
pthread_create(&t11, NULL, &reci, (void *)&args);
pthread_join(t22, NULL);
pthread_cancel(t22);
pthread_join(t11, NULL);
pthread_cancel(t11);
输入例如:aaaaaaaa.....aaaaaaaaa 这是这个词
假设从第一个“a”到最后一个“a”的序列中有 4096 个“a”字符 但是当我打印从标准输入得到的内容时,我得到这个:
这就是这个词 aaaaaaa......aaaaaaa 这就是这个词
它真正做的是首先读取 4096.char 形式的所有字符。在此示例中,它是“THIS IS THE WORD”并首先打印它。它实际上首先打印了应该打印的内容。
所有字符之间无行尾符号 起初我认为内存分配有问题,因为我分配了 4096 字节的内存,但事实并非如此。我测试过。 谢谢你的帮助 抱歉英语不好
最佳答案
这更像是一条评论,而不是一个答案,但由于它很长,所以我按原样将其发布在这里。
一定还有其他问题,因为将“有问题的”部分隔离为:
char c;
int i=0, j=1, data_cap=4096;
char *str = calloc(data_cap,sizeof(char));
while((c = getc(stdin)) != '\n') {
if (j >= data_cap) {
str = realloc(str,sizeof(char) * data_cap * 2);
data_cap = data_cap * 2;
}
str[i] = c;
i++;
j++;
}
if (j >= data_cap) {
str = realloc(str,sizeof(char) * data_cap * 2);
}
str[i] = '\0';
if(strlen(str)!=0) {
char *bufferIn = message("test",str);
printf("%s\n",bufferIn);
free(bufferIn);
}
free(str); i = 0; j = 1; data_cap = 4096;
效果很好。
由于您没有告诉我们函数的参数是什么,因此我们无法透露更多信息...
关于c - 如果 getc 读取超过 4096 个字符,则会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43561277/