从 C 中的函数打印指针字符串 return
Print pointer string which is return from function in C
正在尝试编写一个 C 程序来反转给定的字符串(使用指针),这是代码。
[sample.c]
#include <stdio.h>
#include <stdlib.h>
int _len(char s[])
{
int i = 0;
while (s[i++] != '[=11=]');
return i;
}
char *_reverse(char s[])
{
int len = _len(s);
char *r = malloc(len * sizeof(char));
for (int i=len-1; i >= 0; i--) {
*r++ = s[i];
}
*r = '[=11=]'; // Line 21
r -= len; // Line 22
return r;
}
int main(int argc, char *argv[])
{
char s[10] = "Hello";
printf("Actual String: %s\n", s);
printf("Reversed: %s\n", _reverse(s));
return 0;
}
当前O/P:
Actual String: Hello
Reversed: (null)
预期 O/P:
Actual String: Hello
Reversed: olleH
这里有什么错误或遗漏的..?请纠正我。提前致谢。
你在循环中增加 r
,然后 return。显然,它指向的是实际反转字符串之后的地址。将 r 复制到 malloc
和 return 之后的另一个变量。
您正在修改新分配内存的指针“r”。因此,在反向函数的末尾,它仅指向您分配的缓冲区的末尾。
您可以通过以下方式将其移回开头:
r -= len;
但为了简化事情,我建议在开始时使用 i 和 len 来计算索引。
此外,您不要以 '\0' 终止反转的字符串。
首先是 _len
函数根据定义不正确,它应该排除最后一个 '[=13=]'
终止符(应该是:return i-1;
)。另外上面已经指出了,需要使用不同的变量来遍历char *.
#include <stdio.h>
#include <stdlib.h>
int _len(char s[]) {
int i = 0;
while (s[i++] != '[=10=]');
return i-1;
}
char *_reverse(char s[]) {
int len = _len(s);
//printf("Len: %d\n", len);
char *r = (char *) malloc((len+1) * sizeof(char));
char *ptr = r;
for (int i=len-1; i >= 0; i--) {
//printf("%d %c\n", i, s[i]);
*(ptr++) = s[i];
}
*(ptr++) = '[=10=]';
return r;
}
int main(int argc, char *argv[]) {
char s[10] = "Hello";
printf("Actual String: %s\n", s);
printf("Reversed: %s\n", _reverse(s));
return 0;
}
Actual String: Hello
Reversed: olleH
第一个函数实现
int _len(char s[])
{
int i = 0;
while (s[i++] != '[=10=]');
return i; // Old code
}
虽然没有标准的行为和声明,但或多或少是正确的。只是您必须考虑到返回值包括终止零。
因此内存分配
char *r = malloc(len * sizeof(char));
正确。
然而for循环中变量i
的初始值
for (int i=len-1; i >= 0; i--) {
不正确,因为索引表达式 len - 1
指向将写入新字符串第一个位置的源字符串的终止零。结果,新数组将包含一个空字符串。
另一方面,此函数定义(更新后显示在 post 中)
int _len(char s[])
{
int i = 0;
while (s[i++] != '[=13=]');
// return i; // Old code
return i == 0 ? i : i-1; // Line 9 (Corrected)
}
没有多大意义,因为由于 while 循环中的 prost-increment 运算符,i
永远不会等于 0。而且现在内存分配
char *r = malloc(len * sizeof(char));
不正确。终止零字符 '[=25=]'
.
没有 space
此外,在标识符前加下划线也不是一个好主意。这样的名字可以被系统保留。
函数可以通过以下方式声明和定义
size_t len( const char *s )
{
size_t n = 0;
while ( s[n] ) ++n;
return n;
}
反转字符串不需要分配内存/如果你想创建一个新字符串并以相反的顺序复制源字符串,那么函数必须声明为
char * reverse( const char * s );
即参数应具有限定符 const
。否则,如果没有限定符 const
,函数声明就会令人困惑。函数的使用者可以认为是源字符串被反转了。
所以如果函数声明为
char * reverse( char *s );
那么可以这样定义。
char * reverse( char *s )
{
for ( size_t i = 0, n = len( s ); i < n / 2; i++ )
{
char c = s[i];
s[i] = s[n - i - 1];
s[n - i - 1] = c;
}
return s;
}
如果您想以相反的顺序从源字符串创建一个新字符串,那么该函数可以类似于
char * reverse_copy( const char *s )
{
size_t n = len( s );
char *result = malloc( len + 1 );
if ( result != NULL )
{
size_t i = 0;
while ( n != 0 )
{
result[i++] = s[--n];
}
result[i] = '[=19=]';
}
return result;
}
当不再需要结果数组时,不要忘记释放 main 中的结果数组。
例如
char s[10] = "Hello";
printf("Actual String: %s\n", s);
char *t = reverse_copy( s );
printf("Reversed: %s\n", _reverse(t));
free( t );
Trying to write a C program to reverse the given string (using
Pointer) and here is the code
如果您想在不使用下标运算符和索引变量的情况下定义函数,那么函数 len
和 reverse_copy
可以采用以下方式
size_t len( const char *s )
{
const char *p = s;
while (*p) ++p;
return p - s;
}
char * reverse_copy( const char *s )
{
size_t n = len( s );
char *p = malloc( n + 1 );
if (p)
{
p += n;
*p = '[=21=]';
while (*s) *--p = *s++;
}
return p;
}
并注意我的回答是最佳答案。:)
正在尝试编写一个 C 程序来反转给定的字符串(使用指针),这是代码。
[sample.c]
#include <stdio.h>
#include <stdlib.h>
int _len(char s[])
{
int i = 0;
while (s[i++] != '[=11=]');
return i;
}
char *_reverse(char s[])
{
int len = _len(s);
char *r = malloc(len * sizeof(char));
for (int i=len-1; i >= 0; i--) {
*r++ = s[i];
}
*r = '[=11=]'; // Line 21
r -= len; // Line 22
return r;
}
int main(int argc, char *argv[])
{
char s[10] = "Hello";
printf("Actual String: %s\n", s);
printf("Reversed: %s\n", _reverse(s));
return 0;
}
当前O/P:
Actual String: Hello
Reversed: (null)
预期 O/P:
Actual String: Hello
Reversed: olleH
这里有什么错误或遗漏的..?请纠正我。提前致谢。
你在循环中增加 r
,然后 return。显然,它指向的是实际反转字符串之后的地址。将 r 复制到 malloc
和 return 之后的另一个变量。
您正在修改新分配内存的指针“r”。因此,在反向函数的末尾,它仅指向您分配的缓冲区的末尾。 您可以通过以下方式将其移回开头:
r -= len;
但为了简化事情,我建议在开始时使用 i 和 len 来计算索引。
此外,您不要以 '\0' 终止反转的字符串。
首先是 _len
函数根据定义不正确,它应该排除最后一个 '[=13=]'
终止符(应该是:return i-1;
)。另外上面已经指出了,需要使用不同的变量来遍历char *.
#include <stdio.h>
#include <stdlib.h>
int _len(char s[]) {
int i = 0;
while (s[i++] != '[=10=]');
return i-1;
}
char *_reverse(char s[]) {
int len = _len(s);
//printf("Len: %d\n", len);
char *r = (char *) malloc((len+1) * sizeof(char));
char *ptr = r;
for (int i=len-1; i >= 0; i--) {
//printf("%d %c\n", i, s[i]);
*(ptr++) = s[i];
}
*(ptr++) = '[=10=]';
return r;
}
int main(int argc, char *argv[]) {
char s[10] = "Hello";
printf("Actual String: %s\n", s);
printf("Reversed: %s\n", _reverse(s));
return 0;
}
Actual String: Hello
Reversed: olleH
第一个函数实现
int _len(char s[])
{
int i = 0;
while (s[i++] != '[=10=]');
return i; // Old code
}
虽然没有标准的行为和声明,但或多或少是正确的。只是您必须考虑到返回值包括终止零。
因此内存分配
char *r = malloc(len * sizeof(char));
正确。
然而for循环中变量i
的初始值
for (int i=len-1; i >= 0; i--) {
不正确,因为索引表达式 len - 1
指向将写入新字符串第一个位置的源字符串的终止零。结果,新数组将包含一个空字符串。
另一方面,此函数定义(更新后显示在 post 中)
int _len(char s[])
{
int i = 0;
while (s[i++] != '[=13=]');
// return i; // Old code
return i == 0 ? i : i-1; // Line 9 (Corrected)
}
没有多大意义,因为由于 while 循环中的 prost-increment 运算符,i
永远不会等于 0。而且现在内存分配
char *r = malloc(len * sizeof(char));
不正确。终止零字符 '[=25=]'
.
此外,在标识符前加下划线也不是一个好主意。这样的名字可以被系统保留。
函数可以通过以下方式声明和定义
size_t len( const char *s )
{
size_t n = 0;
while ( s[n] ) ++n;
return n;
}
反转字符串不需要分配内存/如果你想创建一个新字符串并以相反的顺序复制源字符串,那么函数必须声明为
char * reverse( const char * s );
即参数应具有限定符 const
。否则,如果没有限定符 const
,函数声明就会令人困惑。函数的使用者可以认为是源字符串被反转了。
所以如果函数声明为
char * reverse( char *s );
那么可以这样定义。
char * reverse( char *s )
{
for ( size_t i = 0, n = len( s ); i < n / 2; i++ )
{
char c = s[i];
s[i] = s[n - i - 1];
s[n - i - 1] = c;
}
return s;
}
如果您想以相反的顺序从源字符串创建一个新字符串,那么该函数可以类似于
char * reverse_copy( const char *s )
{
size_t n = len( s );
char *result = malloc( len + 1 );
if ( result != NULL )
{
size_t i = 0;
while ( n != 0 )
{
result[i++] = s[--n];
}
result[i] = '[=19=]';
}
return result;
}
当不再需要结果数组时,不要忘记释放 main 中的结果数组。
例如
char s[10] = "Hello";
printf("Actual String: %s\n", s);
char *t = reverse_copy( s );
printf("Reversed: %s\n", _reverse(t));
free( t );
Trying to write a C program to reverse the given string (using Pointer) and here is the code
如果您想在不使用下标运算符和索引变量的情况下定义函数,那么函数 len
和 reverse_copy
可以采用以下方式
size_t len( const char *s )
{
const char *p = s;
while (*p) ++p;
return p - s;
}
char * reverse_copy( const char *s )
{
size_t n = len( s );
char *p = malloc( n + 1 );
if (p)
{
p += n;
*p = '[=21=]';
while (*s) *--p = *s++;
}
return p;
}
并注意我的回答是最佳答案。:)