简体   繁体   中英

string not printing properly in C

I am encountering a problem while printing out a string using a while loop in a standalone function.

I have the following code:

#include <stdio.h>
int pword(char *);
int main() {
    char s[] = "Alice";
    pword(s);
    return 0;
}

int pword(char *s) {
    while(*s!='\0') {
        printf("%s", s);
        s++;
    }
    printf("\n");
    return 0;
}

This is printing: Aliceliceicecee .

you're printing the offseted word each time, instead of the character.

Try changing (for instance)

printf("%s", s);

by

printf("%c", *s);

or since you don't really need formatting, use

putchar(*s);

(all this means that you're basically rewriting puts with a loop. So if no further processing is required on the characters, maybe you should just stick with standard functions)

%s means expect a const char * argument

%c means expect a character argument. The character argument is printed. Null characters are ignored;

You are looking for later one.

More info on %s : The argument is taken to be a string (character pointer), and characters from the string are printed until a null character or until the number of characters indicated by the precision specification is reached; however, if the precision is 0 or missing, all characters up to a null are printed;

Seeing no answer explained what exactly was going on, here is what you are actually doing:

int pword(char *s) {      /* s = "Alice" (s is a char* that holds the address of "Alice" string)*/
    while(*s!='\0') {     /* check if the first char pointed to by s != '\0' */
    printf("%s", s);      /* print the string that start at s*/
    s++;                  /* move s (the char pointer) 1 step forward*/
  }                       /* s points to "lice" -> "ice" -> "ce" -> "e" */
    printf("\n");
    return 0;
}

In order to print the string "Alice" you could have just used printf("%s", s); as it would take the address pointed to by s , where "Alice" is stored, and print it until reaching null-terminator ( '\\0' ).

If you want to use a loop and print char by char , you should have used printf("%c", *s); . Using %c is meant for printing char where %s is for printing strings. Another thing to note is the s vs *s , where the former is a char* (pointer to char) that can hold number of consecutive char s, and the later ( *s) is *(char*) ie dereferenced char* , that holds a single char .

To sum up:

print char by char

int pword(char *s) {
    while(*s!='\0') {
    printf("%c", *s);
    s++;
  }
    printf("\n");
    return 0;
}

print the whole string at once

int pword(char *s) {
    printf("%s\n", s);
    return 0;
}

If you want to print character by character, you should use *s in the printf statement like below.

  #include <stdio.h>
    int pword(char *);
    int main() {
        char s[] = "Alice";
        pword(s);
        return 0;
    }

    int pword(char *s) {
        while(*s!='\0') {
        printf("%c", *s);
        s++;
      }
        printf("\n");
        return 0;
    } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM