【发布时间】:2015-10-17 00:42:16
【问题描述】:
我正在从套接字读取字节并将其复制到 char 数组中。
char usrInputStr[256];
if ((rbytes = read(STDIN_FILENO, usrInputStr, 256)) < 0) {
perror("Read error: ");
exit(-1);
}
char finalStr[rbytes + 1];
memcpy(finalStr, usrInputStr, rbytes);
现在我在堆上分配一个数组并将字符串拆分为单词并将每个单词放入一个 char 数组的数组中。这是执行此操作的代码。
char** currentTokens = (char**)malloc(sizeof(char*) * 256);
for(int i = 0; i < 256; i++) {
currentTokens[i] = (char*)malloc(sizeof(char) * 256);
}
int sz = splitStrToArray(finalStr, currentTokens);
splitStrToArray 函数的定义在这里,可以正常工作。
int splitStrToArray(char* str, char** arr) {
int count = 0;
char* buffer;
int len = strlen(str);
for (int i = 0; i < len ; ++i) {
if(isspace(str[i])) {
count++;
}
}
int index = 0;
buffer = strtok(str, " ");
while(buffer != NULL) {
memcpy(arr[index], buffer, strlen(buffer));
index++;
buffer = strtok(NULL, " ");
}
return count;
}
但是,当我将其与用户输入进行比较时,它不会返回零,因此两个字符串不匹配。
if(strncasecmp(currentTokens[0], "quit") == 0) {
printf("quit" );
breakTrigger = 1;
} else if(strcasecmp(currentTokens[0], "q") == 0) {
printf("q");
breakTrigger = 1;
} else {
callback(currentTokens, sz, port);
}
我检查了 currentTokens[0] 并且这个词是正确的。 当我尝试在 int 中获取 strcasecmp 的返回值并打印它时,我得到了 Segmentation Fault。 我是 C 新手,感谢任何帮助。
【问题讨论】:
-
你确定
currentTokens[0]真的正确吗:没有多余的字符,比如换行符吗? -
当我 printf currentTokens[0] 它给出正确的输出就是我的意思。
-
MikeCAT 的意思是,如果
currentTokens[0]是quit,那么printf("%s1\n", currentTokens[0]);应该在不同的行上打印quit1而不是quit和1。 -
@Antithesis 终止字符、换行符、制表符、空格等很难注意到,除非您使用像 Chrono 提到的技巧。尝试在应该删除此类字符的文本之前和之后修剪用户输入。
-
可以使用these functions辅助调试,具体是
print_escstr函数。空格字符以外的所有可打印字节都正常打印,空格字符和不可打印字节使用<XX>形式的转义符打印,其中XX是表示单个字节的2 个字符的十六进制序列。跨度>