C.印刷品没有出来,到目前为止还没有弄明白为什么

时间:2016-10-19 10:05:31

标签: c string printf

这是我的代码:

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

void splitString(char s[]) {

    char firstHalf[100] = { 0 };
    char secndHalf[100] = { 0 };

    for (int i = 0; i < strlen(s) / 2; i++){
        firstHalf[i] = s[i];
    }

    for (int i = strlen(s) /2; i < strlen(s); i++){
        secndHalf[i - strlen(s) / 2] = s[i];
    }

    printf("The string split in two is '%s, - %s' \n", firstHalf, secndHalf);
}

void upperCase(char s[]){

    //String in upper case
    for (size_t i = 0; i < strlen(s); i++)
    s[i] = toupper(s[i]);

        printf("The string in uppercase is '%s'", s);
}

void lowerCase(char s[]){

    //String in lower case
    for (size_t i = 0; i < strlen(s); i++)
        s[i] = tolower(s[i]);

        printf("The string in lowercase is '%s'", s);
}

int main() {

    char s[200];
    char splitS[200];

    printf("Type a string: ", sizeof( s));

    if (fgets(s, sizeof(s), stdin) != 0){
        printf("The string is '%s'", s);
    }

    strcpy(splitS, s);

    upperCase(s);
    lowerCase(s);
    splitString(splitS);

    return 0;
}

它应该打印的正确方式是这样的:

  

字符串是'Hello world'

     

大写的字符串是'HELLO WORLD'

     

小写的字符串是'hello world'

     

分为两部分的字符串是'Hello, - world'

但它的打印方式如下:

  

字符串是'Hello world

     

'大写的字符串是'HELLO WORLD

     

'小写的字符串是'hello world

     

'分为两部分的字符串是'Hello, - world

     

5 个答案:

答案 0 :(得分:1)

你需要阅读documentation for fgets()(我的重点):

  

fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。阅读在EOF或换行符后停止。 如果读取换行符,则将其存储到缓冲区中。终止空字节('\0')存储在缓冲区中的最后一个字符之后。

由于您在这些行中输入了包含换行符的行,因此您需要在代码中删除它们。

答案 1 :(得分:1)

你必须把null终止符

void splitString(char s[]) {

char firstHalf[100] = { 0 };
char secndHalf[100] = { 0 };

// u need to add null terminator '\0' at the end of string
// so u can add it in for loop or set i outside of loop

for (size_t i = 0; i < strlen(s) / 2; i++){
    firstHalf[i] = s[i];
    **firstHalf[i+1] = '\0';**
}

for (size_t i = strlen(s) /2; i < strlen(s); i++){
    secndHalf[i - strlen(s) / 2] = s[i];
    **secndHalf[i+1] = '\0';**
}

printf("The string split in two is '%s, - %s' \n", firstHalf, secndHalf);

}

答案 2 :(得分:0)

fgets函数将读取换行符并将其附加到其所在房间的输入字符串中。

您需要检查字符串中的最后一个字符是否为\n,如果是,则将其设置为零以修剪它。

答案 3 :(得分:0)

这种情况正在发生,因为fgets在输入字符串的末尾保留了newline,同时也因为您没有自己打印newline

结果是,newline打印在错误的位置,拆分消息,'出现在下一行。

从条目中删除newline的简便方法是使用

s [ strcspn(s, "\r\n") ] = 0;

但请勿忘记将\n添加到printf格式字符串的末尾。

答案 4 :(得分:0)

我使用scanf格式说明符%[^\n]s,因此您可以跳过fgets设置的新行,并在每个\n中添加printf

完整的工作代码:

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

void splitString(char s[]) {

    char firstHalf[100] = { 0 };
    char secndHalf[100] = { 0 };
int i;
    for ( i = 0; i < strlen(s) / 2; i++){
        firstHalf[i] = s[i];
    }

    for ( i = strlen(s) /2; i < strlen(s); i++){
        secndHalf[i - strlen(s) / 2] = s[i];
    }

    printf("\n The string split in two is '%s, - %s' \n", firstHalf, secndHalf);
}

void upperCase(char s[]){

    //String in upper case
    int i;
    for (i = 0; i < strlen(s); i++)
    s[i] = toupper(s[i]);

        printf("\n The string in uppercase is '%s'", s);
}

void lowerCase(char s[]){

    //String in lower case
    int i;
    for ( i = 0; i < strlen(s); i++)
        s[i] = tolower(s[i]);

        printf("\n The string in lowercase is '%s'", s);
}

int main() {

    char s[200];
    char splitS[200];

    printf("Type a string: %ld", sizeof( s));

    if (scanf("%200[^\n]s", s)!= 0){  //fgets(s, sizeof(s), stdin) 
        printf("\n The string is '%s'", s);
    }

    strcpy(splitS, s);

    upperCase(s);
    lowerCase(s);
    splitString(splitS);

    return 0;
}

如果您只想使用fgets,请在字符串中找到新的行字符并将其设为NULL,并在每个'\n'中添加新行字符printf

需要更改的代码是:

 if ( fgets(s, sizeof(s), stdin) != 0){   
     int  i;
     for(i = 0 ; i < sizeof( s) ; i++ ){
          if(s[i] == '\n'){
               s[i] = '\0';     
               break;
          }
      }
    printf("\n The string is '%s'", s); 
 }