我正在尝试检测明文的哪一行以" linePrefix"开头。使用上面的代码,即使有巧合,strcmp
永远不会返回0.有谁知道我在哪里失败了?
const char PREFIX[] = {"linePrefix"};
FILE *fp;
char *line = NULL;
char *aux = NULL;
aux = (char *) malloc(16);
size_t len = 0;
ssize_t read;
char path[] = {/*path*/};
fp = fopen(path, "r");
while ((read = getline(&line, &len, fp)) != -1) {
strncpy(aux, line, 15);
printf("strcmp: %i\n, strcmp(aux, PREFIX));
}
答案 0 :(得分:4)
您忘记在aux
上添加字符串终结符:
strncpy(aux, line, 15);
aux[15] = `\0`;
请注意,在不需要复制字符串的情况下,可以使用更简单的方法进行比较。只需直接与line
的开头比较:
while ((read = getline(&line, &len, fp)) != -1) {
printf("strcmp: %i\n, strncmp(line, PREFIX, strlen(PREFIX)));
}
答案 1 :(得分:0)
最有可能的是,这些行超过15个字符,在这种情况下strncpy()会中断。 strncpy表现为:
如果s2指向的数组是一个短于n个字符的字符串,则为空字符 被附加到s1指向的数组中的副本,直到所有的字符都是 写入。
换句话说,如果没有空间,strncpy将不会终止程序,导致程序崩溃和刻录。因此,避免strncpy(),这是一个危险的功能,程序员经常无法正确使用。
更好的代码:
set { cboRubroPadre.SelectedItem = value; }
set { cboRubroPadre.SelectedItem = cboRubroPadre.FindString(value.Nombre); }
set { cboRubroPadre.SelectedItem = cboRubroPadre.FindStringExact(value.Nombre); }