1

我没有得到什么?

这很好用:

for ( i = 0; i < 5 && found != 0 ;++i ){ no difference than above
        found=strcmp( name, myContacts[i].cFirstName);
        printf(" i %d\n", i);
    }
printf(" \nName Found %s",  myContacts[i-1].cFirstName );

但出于好奇,我也尝试使用 strstr()。

/*** This achieves the same functionality as above ***/

    for ( i = 0; i < 5  ;i++ ){
    found2=strstr( myContacts[i].cFirstName , name);
    printf(" i %d\n", i);
    if (found2 != NULL)
        {
        printf(" \nName Found %s",  myContacts[i].cFirstName );
        break;
        }
    }    

然而,这不起作用:

for ( i = 0; i < 5 && found2 != '\0' ;i++ ){ //this does not work as above
for ( i = 0; i < 5 && found2 != NULL ;i++ ){ // this also is not wroking
        found2=strstr( myContacts[i].cFirstName , name);
}

printf(" \nName Found %s",  myContacts[i].cFirstName );

提前感谢您的建议。

完整代码:

# please take my codes with a grain of skepticism, I am still learning 
# i know of sizeof(), but I rather not use it just for the purpose of my exercise

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXBUFFERSIZE   10

typedef struct contact {

    char cFirstName[10];
    char cLastName[10];
    char cTelphone[12];

} address ; // end type

// function prototype
void printContacts( address * );
void printMenu();
char getChoice();
void storeContact( address [] ,  int *);
//int searchContact( address [] , char * );
void searchContact( address [] , char [] );

int main(){

    char cSelection = 0;
    address myContacts[5];
    char buffer[MAXBUFFERSIZE];

    int i ;
    // initialize array to be zeros
    for ( i = 0; i < 5 ; i++ ){
        strcpy(myContacts[i].cFirstName, "0");
        strcpy(myContacts[i].cLastName,"0");
        strcpy(myContacts[i].cTelphone,"0"); 
    }

    strcpy(myContacts[0].cFirstName, "Jonny");
    strcpy(myContacts[1].cFirstName, "Julia");
    strcpy(myContacts[2].cFirstName, "Claudia");
    strcpy(myContacts[3].cFirstName, "Aaron");
    strcpy(myContacts[4].cFirstName, "Sebastian");

    int iDel = -1 ; // store the position if one deleted
    int iCount = 0 ; // counter for position in the array, when 
                     // inserting names.

    while ( cSelection != '5' ) {
    printMenu();
    cSelection = getChoice();

    switch (cSelection) {
        case '1':
            printContacts( myContacts );    
            break;

        case '2':
            if ( ( iDel >= -1 ) && ( iCount < 5 ) ){
                //printf("\niCount is %d ", iCount);
                storeContact( myContacts, &iCount );
                iCount++;
                //printf("\nOutside storeContact, *Plocation %d", iCount );
                }
            if ( iCount >= 5 ) {
                printf("\nThe Memory is full, consider deleting some"\
                "Contacts");    
                }
            break;

        case '3':
            {            
            printf("\nEnter a name or part of a name to search:\n");
            fscanf(stdin, "%s", buffer);
            getchar(); // clear the last enter
            printf("\nThe line you entered was:\n");
            printf("%s\n", buffer);
            searchContact( myContacts, buffer );
            break;
            }       
        case '4':   
            //iDel=deleteContact( myContacts );
            break;

        }// end of switch
    }// end of while
    return 0;
} // end main

char getChoice(){

    char cSelection = 'q'; //for the menu
    /**** always scanf CHARS so you can check
     *    if digit or char !!! ****/

    scanf("%s", &cSelection);

    while ( strlen(&cSelection) != 1 ){
        printf("\nChoich not understood, enter a number again:");
        scanf("%s",&cSelection);
        }

    if ( isalpha(cSelection) ){
        printf( "You entered a letter of the alphabet\n" );
        cSelection = -1;
        printf( "Illegal choice !!!" );
      }

    return cSelection;
    } 

void printContacts( address * myContacts ){

    int i ;

    for ( i = 0; strcmp(myContacts[i].cFirstName,"0") != 0 && i < 5 ; i++ ){                                             
        printf("\nmyContacts[%d].cFirstName: %s", i, \
        myContacts[i].cFirstName );
    }// end for
}

void printMenu(){
    printf("\n\n\tSilly Phone Book\n\n");
    printf("\n\n1\tPrint Phone Book\n");
    printf("2\tAdd New Contact\n");
    printf("3\tSearch For Contact\n");
    printf("4\tDelete Contact\n");
    printf("5\tQuit\n");
    printf("\nSelect Action: ");
    }

//void storeContact( address myContacts[] ){ //syntactic sugar
void storeContact( address * myContacts,  int *Plocation ){ 

    char ch;                     /* handles user input */
    char buffer[MAXBUFFERSIZE];  /* sufficient to handle one line */
    int x = 0;
    x=*Plocation;

    ch = getchar(); // clear the last enter
    printf("Enter a name (<10 characters)\n");
    //ch = getchar();
    //char_count = 0;
    //while( (ch != '\n')  && (ch != EOF ) &&  (char_count < MAXBUFFERSIZE)) {
        //buffer[char_count++] = ch;
        //ch = getchar();
    //}
    //buffer[char_count] = 0x00;      /* null terminate buffer */

    //fgets(buffer,11,stdin);

    fscanf(stdin, "%s", buffer); /* read from keyboard */

    printf("\nThe line you entered was:\n");
    printf("%s\n", buffer);

    //TODO: add check that string is not too long!!!
    // if we do that, the code won't blow here ?

    strcpy(myContacts[x].cFirstName, buffer);    
} 

//int searchContact( address * myContacts,    char name[] ){
void searchContact( address * myContacts,    char * name ){
    int found;
    char *found2;
    //printf("\nHey dude im buffer from inside searchContact: %s", name);
    // iterate throught the array, print possible matches
    int i = 0;


    //for ( i = 0; i < 5 && found != 0 ;i++ ){
    //for ( i = 0; i < 5 && found != 0 ;++i ){ no difference than above
        //found=strcmp( name, myContacts[i].cFirstName);
        //printf(" i %d\n", i);
    //}
    //printf(" \nName Found %s",  myContacts[i-1].cFirstName );

    /*** This achieves the same functionality as above 

    for ( i = 0; i < 5  ;i++ ){
    found2=strstr( myContacts[i].cFirstName , name);
    printf(" i %d\n", i);
    if (found2 != NULL)
        {
        printf(" \nName Found %s",  myContacts[i].cFirstName );
        break;
        }
    }    ***/

    for ( i = 0; i < 5 && &found2 != '\0' ;i++ ){ //this does not work as above
        found2=strstr( myContacts[i].cFirstName , name);
        printf("found %p i %d\n", found2, i);
        //printf(" \nName Found %s",  myContacts[i].cFirstName );
    }

    //return found;
} // end of searchContacts  if ( isalpha(cSelection) ){
        printf( "You entered a letter of the alphabet\n" );
        cSelection = -1;
        printf( "Illegal choice !!!" );
      }

    return cSelection;
    } 

void printContacts( address * myContacts ){

    int i ;

    for ( i = 0; strcmp(myContacts[i].cFirstName,"0") != 0 && i < 5 ; i++ ){                                             
        printf("\nmyContacts[%d].cFirstName: %s", i, \
        myContacts[i].cFirstName );
    }// end for
}

void printMenu(){
    printf("\n\n\tSilly Phone Book\n\n");
    printf("\n\n1\tPrint Phone Book\n");
    printf("2\tAdd New Contact\n");
    printf("3\tSearch For Contact\n");
    printf("4\tDelete Contact\n");
    printf("5\tQuit\n");
    printf("\nSelect Action: ");
    }

//void storeContact( address myContacts[] ){ //syntactic sugar
void storeContact( address * myContacts,  int *Plocation ){ 

    char ch;                     /* handles user input */
    char buffer[MAXBUFFERSIZE];  /* sufficient to handle one line */
    int x = 0;
    x=*Plocation;

    ch = getchar(); // clear the last enter
    printf("Enter a name (<10 characters)\n");
    //ch = getchar();
    //char_count = 0;
    //while( (ch != '\n')  && (ch != EOF ) &&  (char_count < MAXBUFFERSIZE)) {
        //buffer[char_count++] = ch;
        //ch = getchar();
    //}
    //buffer[char_count] = 0x00;      /* null terminate buffer */

    //fgets(buffer,11,stdin);

    fscanf(stdin, "%s", buffer); /* read from keyboard */

    printf("\nThe line you entered was:\n");
    printf("%s\n", buffer);

    //TODO: add check that string is not too long!!!
    // if we do that, the code won't blow here ?

    strcpy(myContacts[x].cFirstName, buffer);    
} 

//int searchContact( address * myContacts,    char name[] ){
void searchContact( address * myContacts,    char * name ){
    int found;
    char *found2;
    //printf("\nHey dude im buffer from inside searchContact: %s", name);
    // iterate throught the array, print possible matches
    int i = 0;


    //for ( i = 0; i < 5 && found != 0 ;i++ ){
    //for ( i = 0; i < 5 && found != 0 ;++i ){ no difference than above
        //found=strcmp( name, myContacts[i].cFirstName);
        //printf(" i %d\n", i);
    //}
    //printf(" \nName Found %s",  myContacts[i-1].cFirstName );

    /*** This achieves the same functionality as above 

    for ( i = 0; i < 5  ;i++ ){
    found2=strstr( myContacts[i].cFirstName , name);
    printf(" i %d\n", i);
    if (found2 != NULL)
        {
        printf(" \nName Found %s",  myContacts[i].cFirstName );
        break;
        }
    }    ***/

    for ( i = 0; i < 5 && found2 != '\0' ;i++ ){ //this does not work as above
        found2=strstr( myContacts[i].cFirstName , name);
        printf("found %p i %d\n", found2, i);
        //printf(" \nName Found %s",  myContacts[i].cFirstName );
    }

    //return found;
} // end of searchContacts

只是为了这个讨论的完整性,我添加了最终真正按我想要的方式工作的内容。这是在浏览了所有答案之后出现的,所以谢谢大家:

我忘了初始化指针:

char *found2=NULL;

现在以下循环按预期工作:

 for ( i = 0; i < 5 && !found2 ;i++ ){ //this does work as above

        found2=strstr( myContacts[i].cFirstName , name);
        printf("i %d\n", i);

    }
    printf("Name found %s", found2);

我想要 strstr() 的这个功能,因为现在我可以搜索“Clau”并将其匹配到“Claudia”。这比 strcmp() 更符合我的需要,尽管我很确定它也可以使用 strcmp() 来完成,而且 C 语言比我拥有的更复杂或更好的技能。

再次感谢您的回答!

4

3 回答 3

1

found2的是一个char *.

你应该写for (i = 0; i < 5 && !found2; i++) //etc etc

(或found2在循环中测试并在非 NULL 时中断)

于 2011-12-19T20:57:52.307 回答
1

不要使用cicles。通过使用 strstr() 你只需要使用一次这样:

found2=strstr( myContacts[i].cFirstName , name);
printf(" \nName Found %s",  found2 );

(不要忘记相应的空检查)

于 2011-12-19T20:58:25.240 回答
1

for循环中使用您的条件:

&found2 != '\0'

您想检查是否found2指向NULL,甚至提到自己,所以请这样做found2 != NULL。否则,您会将 的地址found2NUL 字符 ( '\0') 进行比较,这绝对不是您想要做的。

但是,您说代码段与strstr代码段具有相同的功能也是错误的strcmp。这两个功能完全不同。阅读strstr.

另一件事,在你的第一个片段"Name Found"中总是会被打印出来


您的代码还有很多错误的地方,例如:

scanf("%s", &cSelection);
...
while ( strlen(&cSelection)

cSelection被声明为 a char,如果要在其中存储 a char,请使用格式说明符%c。如果要读取整个字符串,请将其设为char 数组,并且在&将数组地址传递给函数时不需要 。

同样的敌人&cSelection被传递给strlen。出于同样的原因,没有任何意义。


(f)scanf读取字符串也是不安全的,并且可能导致缓冲区溢出,您应该fgets(STRING, SIZE, stdin)改用。无论如何,只需打开你的编译器警告,这样你就可以捕捉到上述所有内容。

于 2011-12-19T21:08:58.410 回答