这是我的代码:
#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
答案 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);
}