反转c中的字符串,使用strlen函数的问题
Reversing a string in c, problem using strlen function
我写了一段代码来反转字符串,但是 strlen
函数给出了错误的字符串长度,这就是为什么不能正确反转字符串的原因。这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reversestring(char string[], int start, int end);
int main() {
char str[500];
int n;
n = strlen(str);
reversestring(str, 0, n - 1);
printf("%d\n", n);
printf("The reverse string is %s", str);
return 0;
}
void reversestring(char string[], int start, int end) {
printf("enter the string:\n");
scanf("%s", string);
int temp;
while (start < end) {
//printf("insidewhile\n");
temp = string[start];
string[start] = string[end];
string[end] = temp;
start++;
end --;
}
}
你应该在 str
初始化后使用 strlen
并设置 reversestring
的第三个参数的正确大小:
size_t max_length = 128;
reversestring(str, 0, max_length);
n = strlen(str);
strlen()
不能给你一个字符串的长度,当它的参数没有指向一个有效的字符串时,你的例子就是这种情况:
char str[500];
int n;
n = strlen(str);
str
未使用字符串初始化。
提供指向 char
数组的指针,该数组不包含字符串作为 strlen()
的参数会导致未定义的行为。
而且 strlen()
不 return 和 int
。它的 return 值是 size_t
类型。
输入字符串时也使用fgets()
代替scanf()
。安全一点。
解决方案:
让main()
中的字符串进入str
,然后使用strlen()
,然后调用reversestring()
函数:
char str[500];
size_t n;
printf("enter the string:\n");
fgets(str,500,stdin);
n = strlen(str);
reversestring(str, 0, n-1);
我还相应地编辑了函数声明和 printf()
以处理 size_t
类型。
这是完整的代码 (Online Example):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reversestring(char string[], size_t start, size_t end);
int main()
{
char str[500];
size_t n;
printf("enter the string:\n");
fgets(str,500,stdin);
str[strcspn(str, "\n")] = 0; // removing trailing newline from fgets
n = strlen(str);
reversestring(str, 0, n-1);
printf("%zu\n", n);
printf("The reverse string is %s", str);
return 0;
}
void reversestring(char string[], size_t start, size_t end)
{
int temp;
while(start < end)
{ //printf("insidewhile\n");
temp = string[start];
string[start] = string[end];
string[end] = temp;
start++;
end --;
}
}
输出:
enter the string:
helloworld
10
The reverse string is dlrowolleh
声明的字符数组中没有字符串
{ char str[500];
int n;
字符数组未初始化。所以这个调用
n = strlen(str);
导致未定义的行为。
此代码片段来自函数 reversestring
printf("enter the string:\n");
scanf("%s", string);
应在函数外部并在调用函数之前使用。
函数的声明至少要像
char * reversestring( char string[], size_t n );
不需要像你那样声明三个参数的函数
void reversestring(char string[], int start, int end);
因为对这个函数的调用可以替代对前面显示的函数的调用,例如
reversestring( string + start, end - start + 1 );
还要注意使用格式%s
是不允许输入句子的。此外,将此格式说明符与函数 scanf
一起使用是不安全的,并且函数 strlen
具有 return 类型 size_t
.
这是函数定义
char * reversestring( char s[], size_t n )
{
for ( size_t i = 0; i < n / 2; i++ )
{
char c = s[i];
s[i] = s[n-i -1];
s[n-i-1] = c;
}
return s;
}
这是一个演示程序。
#include <stdio.h>
#include <string.h>
char * reversestring( char s[], size_t n )
{
for ( size_t i = 0; i < n / 2; i++ )
{
char c = s[i];
s[i] = s[n-i -1];
s[n-i-1] = c;
}
return s;
}
int main(void)
{
enum { N = 500 };
char s[N];
printf( "Enter a string: " );
fgets( s, N, stdin );
s[ strcspn( s, "\n" ) ] = '[=17=]';
size_t n = strlen( s );
puts( reversestring( s, n ) );
char *p = strchr( s, ' ' );
if ( p != NULL && ( p = strchr( p + 1, ' ' ) ) != NULL )
{
reversestring( s, p - s );
puts( s );
}
return 0;
}
其输出可能类似于
Enter a string: Hello Shivam Gupta
atpuG mavihS olleH
Shivam Gupta olleH
我写了一段代码来反转字符串,但是 strlen
函数给出了错误的字符串长度,这就是为什么不能正确反转字符串的原因。这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reversestring(char string[], int start, int end);
int main() {
char str[500];
int n;
n = strlen(str);
reversestring(str, 0, n - 1);
printf("%d\n", n);
printf("The reverse string is %s", str);
return 0;
}
void reversestring(char string[], int start, int end) {
printf("enter the string:\n");
scanf("%s", string);
int temp;
while (start < end) {
//printf("insidewhile\n");
temp = string[start];
string[start] = string[end];
string[end] = temp;
start++;
end --;
}
}
你应该在 str
初始化后使用 strlen
并设置 reversestring
的第三个参数的正确大小:
size_t max_length = 128;
reversestring(str, 0, max_length);
n = strlen(str);
strlen()
不能给你一个字符串的长度,当它的参数没有指向一个有效的字符串时,你的例子就是这种情况:
char str[500];
int n;
n = strlen(str);
str
未使用字符串初始化。
提供指向 char
数组的指针,该数组不包含字符串作为 strlen()
的参数会导致未定义的行为。
而且 strlen()
不 return 和 int
。它的 return 值是 size_t
类型。
输入字符串时也使用fgets()
代替scanf()
。安全一点。
解决方案:
让main()
中的字符串进入str
,然后使用strlen()
,然后调用reversestring()
函数:
char str[500];
size_t n;
printf("enter the string:\n");
fgets(str,500,stdin);
n = strlen(str);
reversestring(str, 0, n-1);
我还相应地编辑了函数声明和 printf()
以处理 size_t
类型。
这是完整的代码 (Online Example):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reversestring(char string[], size_t start, size_t end);
int main()
{
char str[500];
size_t n;
printf("enter the string:\n");
fgets(str,500,stdin);
str[strcspn(str, "\n")] = 0; // removing trailing newline from fgets
n = strlen(str);
reversestring(str, 0, n-1);
printf("%zu\n", n);
printf("The reverse string is %s", str);
return 0;
}
void reversestring(char string[], size_t start, size_t end)
{
int temp;
while(start < end)
{ //printf("insidewhile\n");
temp = string[start];
string[start] = string[end];
string[end] = temp;
start++;
end --;
}
}
输出:
enter the string:
helloworld
10
The reverse string is dlrowolleh
声明的字符数组中没有字符串
{ char str[500];
int n;
字符数组未初始化。所以这个调用
n = strlen(str);
导致未定义的行为。
此代码片段来自函数 reversestring
printf("enter the string:\n");
scanf("%s", string);
应在函数外部并在调用函数之前使用。
函数的声明至少要像
char * reversestring( char string[], size_t n );
不需要像你那样声明三个参数的函数
void reversestring(char string[], int start, int end);
因为对这个函数的调用可以替代对前面显示的函数的调用,例如
reversestring( string + start, end - start + 1 );
还要注意使用格式%s
是不允许输入句子的。此外,将此格式说明符与函数 scanf
一起使用是不安全的,并且函数 strlen
具有 return 类型 size_t
.
这是函数定义
char * reversestring( char s[], size_t n )
{
for ( size_t i = 0; i < n / 2; i++ )
{
char c = s[i];
s[i] = s[n-i -1];
s[n-i-1] = c;
}
return s;
}
这是一个演示程序。
#include <stdio.h>
#include <string.h>
char * reversestring( char s[], size_t n )
{
for ( size_t i = 0; i < n / 2; i++ )
{
char c = s[i];
s[i] = s[n-i -1];
s[n-i-1] = c;
}
return s;
}
int main(void)
{
enum { N = 500 };
char s[N];
printf( "Enter a string: " );
fgets( s, N, stdin );
s[ strcspn( s, "\n" ) ] = '[=17=]';
size_t n = strlen( s );
puts( reversestring( s, n ) );
char *p = strchr( s, ' ' );
if ( p != NULL && ( p = strchr( p + 1, ' ' ) ) != NULL )
{
reversestring( s, p - s );
puts( s );
}
return 0;
}
其输出可能类似于
Enter a string: Hello Shivam Gupta
atpuG mavihS olleH
Shivam Gupta olleH