我现在正在尝试学习C,并且有一个示例不允许我使用string.h
或其他函数。
例如,我需要使用指针反转字符串。
但是当我交换时,它被卡住了。
#include <stdio.h>
void reverseCopy( char *, char *, int);
int main(){
char *word1 = "Welcome to the C programming";
char word2[50];
int i,count;
for(i=0;i<50;i++){
if(word1[i]=='\0') break;
count++;
}
reverseCopy(word1,word2,count);
return 0;
}
void reverseCopy( char * g1, char * g2 ,int lenght){
g2=g1;
char temp;
int i;
int j=temp-1;
for(i=0;i<j/2;i++){
temp=*(g2+i);
*(g2+i)=*(g2+j-i);
*(g2+j-i)=temp;
}
puts(g2);
}
这样一个以相反的顺序将字符串复制到字符数组的字符串函数应该只有两个参数:目标字符数组和源字符串。假定目标字符数组足够大以容纳源字符串。
关于函数reverseCopy
的定义,甚至是函数的第一个语句
g2=g1;
使该函数变得毫无意义,因为在此语句之后,目标字符数组的地址丢失了。
您显然认为,此分配不会将g1
指向的字符串复制到g2
指向的字符数组中。这种分配使指针g1
和g2
指向与作为参数传递给函数的字符串文字相同的字符串。
现在,在完成此分配之后,您正试图反转导致未定义行为的字符串文字。
此外,您正在使用未初始化的变量,例如
char temp;
//...
int j=temp-1;
如果仅使用指针编写函数,则不应使用起索引作用的整数变量i
。
并且该函数不应输出任何内容。函数的调用者将决定是否输出任何内容。
下面有一个演示程序,显示了如何仅使用指针即可实现该功能。
#include <stdio.h>
char * reverseCopy( char *s1, const char *s2 )
{
const char *last = s2;
while ( *last ) ++ last;
char *first = s1;
while ( last != s2 )
{
*first++ = *--last;
}
*first = '\0';
return s1;
}
int main(void)
{
char *s1 = "Welcome to the C programming";
char s2[50];
puts( s1 );
puts( reverseCopy( s2, s1 ) );
return 0;
}
程序输出为
Welcome to the C programming
gnimmargorp C eht ot emocleW
发布的代码在通过编译器运行时,结果为:
gcc -O1 -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c "untitled2.c" -I. (in directory: /home/richard/Documents/forum)
untitled2.c: In function ‘reverseCopy’:
untitled2.c:15:45: warning: unused parameter ‘lenght’ [-Wunused-parameter]
void reverseCopy( char * g1, char * g2 ,int lenght){
^~~~~~
untitled2.c:19:15: warning: ‘temp’ is used uninitialized in this function [-Wuninitialized]
int j=temp-1;
~~~~^~
untitled2.c: In function ‘main’:
untitled2.c:9:14: warning: ‘count’ is used uninitialized in this function [-Wuninitialized]
count++;
~~~~~^~
Compilation finished successfully.
访问/使用未初始化的变量是未定义的行为。
此语句:
Compilation finished successfully.
仅表示编译器针对这些问题提供了一些“解决方法”。这并不意味着结果代码将执行您期望的结果。
编译时,请启用警告,然后修复这些警告。编译器的以上输出显示了我用于gcc
的选项。其他编译器使用不同的选项来产生相同的结果
发布的代码尚未准备好进行链接。
解决问题,然后联系我们。
OT:为便于阅读和理解:
for
if
else
while
do...while
switch
case
default
通过单个空白行我认为您在temp是一个字符的情况下得到int j = temp-1
的问题bcs,而且g2=g1
的分配也给您带来了问题
我可以建议您以下一个:
void reverseCopy( char * g1, char * g2 ,int lenght){
int i;
for(i=0;i<=lenght;i++){
g2[i]=*(g1+lenght-i);
}
puts(g2);
}
}
Main:
int main(){
char *word1 = "Welcome to the C programming";
char word2[50];
int i,count;
for(i=0;i<50;i++){
if(word1[i]=='\0') break;
count++;
}
reverseCopy(word1,word2,count);
return 0;
}
输出:
gnimmargorp C eht ot emocleW