我是新来的,这是我的第一个问题。
我已经搜索了这个问题,但没有发现任何此类问题。 所以就这样了。
我正在使用2d字符数组为名称数据库编写基于菜单的程序。以下是我的主要功能。
int main(void)
{
char name[MAX][25] = { 0 };
char choice;
while (1) {
printf("******************menu****************\n");
printf("i: input\n");
printf("p: print\n");
printf("f: find\n");
printf("d: delete\n");
printf("s: sort\n");
printf("e: edit\n");
printf("q: quit\n");
printf("**************************************\n\n");
printf("Enter your choice: ");
scanf(" %c", &choice);
getchar();
switch (choice) {
case 'i':
input(name);
break;
case 'p':
print(name);
break;
case 'f':
find(name);
break;
case 'q':
return 0;
default:
printf("Invalid choice\n");
}
}
}
输入和打印功能正常,但我在查找功能方面有问题。 在这里。
void find(char (*p)[25])
{
int i;
char str[25];
if (count == 0) {
printf("Empty database\n");
return;
}
printf("Enter name to search: ");
fgets(str, 25, stdin);
str[strlen(str) - 1] = 0; //Removing new line character at the end of string.
for (i = 0; i < count; i++) {
if (strstr(p[i], str) != NULL); //Breaking the loop, when first occurence is found among all the names.
break;
}
if (i == count) {
printf("Not found\n"); // if loop is not terminated by "break" statement,
// that means strstr returned NULL for all names.
return;
}
printf("Names matching with %s\n", str);
for (i = 0; i < count; i++) {
if (strstr(p[i], str) != NULL); // Again looping to print all the matching names.
puts(p[i]);
}
}
count
是一个全局变量,在输入函数中递增。
strstr
函数总是返回true,即使我提供了一些乱码。
我使用的是ubuntu 16.04 gcc 5.3.1
我尝试使用strstr
处的断点进行调试,它正确地接收了两个字符串,但总是将指针返回到haystack。
__strstr_sse2 (haystack_start=0x7fffffffdcb0 "Imtiyaz", needle_start=0x7fffffffdc60 "abcd") at ../string/strstr.c:53
53 ../string/strstr.c:没有这样的文件或目录。
干草堆是"Imtiyaz"
,针是"abcd"
这是它返回的内容。
find (p=0x7fffffffdcb0) at name_data.c:126
我不明白这里出了什么问题,是不是来自我身边?
还有一件事,以前我尝试使用strcasestr()
,但是编译器会抛出警告“隐式声明”,尽管我正确地包含了<string.h>
。
请帮帮我。
编辑:好的朋友,我也会显示输入和打印功能,让人们正确分析我的程序。顺便说一下,这是正常的。
void input(char (*p)[25])
{
if (count == MAX) {
printf("Memory full\n");
return;
}
printf("Enter name: ");
fgets(p[count], 25, stdin);
p[count][strlen(p[count]) - 1] = 0; //Removing the new line character at the end of string.
count++;
}
void print(char (*p)[25])
{
int i;
if (count == 0) {
printf("Empty database\n");
return;
}
printf("********************************\n");
for (i = 0; i < count; i++) {
printf("%d %s\n", i + 1, p[i]); //printing names with serial numbers.
}
printf("********************************\n");
}
我还没有实现其他功能(比如删除,搜索等),因为你可以看到int switch-case。
答案 0 :(得分:8)
末尾有一个虚假的
;
if (strstr(p[i], str) != NULL);
因此if
语句不执行任何操作,并且始终执行下一个语句break;
。
find
函数中有2次出现此错误。
答案 1 :(得分:1)
.transparent_class {
/* IE 8 */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
/* IE 5-7 */
filter: alpha(opacity=50);
/* Netscape */
-moz-opacity: 0.5;
/* Safari 1.x */
-khtml-opacity: 0.5;
/* Good browsers */
opacity: 0.5;
}
是非标准的,只有在使用它的源文件的最顶层执行此操作时才会定义:
.style.opacity
.style.MsFilter
.style.filter.alpha
.style.MozOpacity
.style.KhtmlOpacity
至于为什么.style.MsFilter = "\"progid:DXImageTransform.Microsoft.Alpha(opacity=1)\"";
没有达到你所期望的效果,你将不得不将你的程序煮得更多,看看有什么不对。就目前而言,有大量的代码,包括一些你没有显示的代码(如strcasestr()
的递增)。