
我把程序给你改了一个,并且有注释,你好好看一下错误的地方。积累一些经验。
#include
"stdioh"
#include
"stringh"
void
reversestr(char
pstr);
void
main()//在此外最好把int改为void,main后面的括号内不要加void了。
{
char
str[81],pstr=str;
gets(str);//此处的while(1)没有实际的作用,反而把程序弄成的死循环,应去掉。
reversestr(pstr);
//此处的return也应该去掉,不需要什么返回值就不要写了。
}
void
reversestr(char
pstr)
{
int
l,i;
char
temp,p=pstr;
l=strlen(pstr);
for(i=0;i<(l/2);p++,i++)//此外的(l/2)最好加上括号
{
temp=p;
p=(p+l-i-1);
(p+l-i-1)=temp;//即然上面的表达式-1了,那么下面的也应该-1对吧。
}
puts(pstr);
}
程序我给你改过了,并且运行成功了。但是答案不正确。希望楼主好好看一下自己程序的缺点,然后再改进一下。如果又遇到什么难题,或是程序答案还没有改对,请追问。我重新把程序给你写一下,然后发给你。
若要C语法,请用注释后的内容替换所在的行
#include <iostream> //#include "stdioh"
using namespace std; //
int main(){
unsigned char str[]="Hello,C++!";
unsigned char pstr=str;
unsigned char space=' ';
while((pstr)){
cout << (pstr) << space; //printf("%c ", (pstr));
}
return 0;
}
大致算法是:
cin 得到标准 string 字符串 str;
从 index=0 开始到 index=strsize() 依次扫描 str[index];
判断 str[index] 的 ASCII 码:
65~90 ('A'-'Z') 为大写字母,
97~122 ('a'-'z') 位小写字母,
32 (' ') 为空格,
48~57 ('0'-'9') 为数字,
剩下的为其他字符;
每个判断条件后跟一个自加1的变量, 最后变量的值就是统计结果
#include <stdioh>
#include <stringh>
#define MAX_LENGTH 32
int main()
{
char str[MAX_LENGTH] = {0};
char pStr = (char)&str;
//1 将字符串computer赋给一个字符数组
strcpy(str, "computer");
//2 然后从第一个字母开始间隔地输出该串
while(pStr != '\0' )
{
printf("%c\n", pStr);
pStr++;
}
return 1;
}
(pstr+i)就是pstr数组的元素i,但这是指针数组,所以里面保存的是指针,可写为pstr[i]。
上面三句就是地址交换。
pstr[6]是指针数组,pstr的每一个元素都是指针。还有字符串比较函数包含在 库函数 stringh中,要包含进去;定义指针时尽量把他赋值为空指针,不然野指针危害很大的。
根据你下面的输出情况,你是从每个字符,的首地址开始输出,所以上面交换的是地址,所以那三句改为
p=pstr[i];
pstr[i]=pstr[j];
pstr[j]=p;
就比较直观了
即把字符比较小的交换到前面去。就可得到你想要的结果。
改后的程序如下:
#include <stdioh>#include <conioh>
#include<stringh>
#define MAXLINE 20
int fun ( char pstr[6]){
int i, j ;
char p=NULL;
for (i=0;i<5;i++)
{
for (j=i+1;j<6;j++)
{
if(strcmp((pstr+i),(pstr+j))> 0)
{
p=pstr[i];
pstr[i]=pstr[j];
pstr[j]=p;
//等同于注释了的这三句
/ p=(pstr+i) ;
(pstr+i)=(pstr+j);
(pstr+j)=p ; /
}
}
}
}
int main(int argc,int aggv[])
{
int i;
char pstr[6],str[6][MAXLINE];
clrscr( );
for(i=0;i<6;i++)
pstr[i]=str[i];
printf("\nEnter 6 string(1 string at each line): \n" );
for(i=0;i<6;i++)
scanf("%s",pstr[i]);
fun(pstr);
printf("The strings after sorting:\n");
for(i=0;i<6;i++)
printf("%s\n", pstr[i]);
return 0;
}
要解决的问题主要是怎么判断字符串的结尾(空格的ASCII码直接用' '就可以了)
一般情况是使用‘\0’判断字符串结尾,但是这样的程序会有漏洞,就是对少数没有‘\0'的字符串 可能 会出错。为什么说可能呢?首先编译的时候肯定没问题,但是在内存一个一个比对字符时,因为字符串中没有’\0'所以到字符串结束时,比对还没结束,他会继续将相邻物理内存中的数据取出对比,直到遇到‘\0'为止;所以建议把函数改成int CountSpace(char pStr,int n);n用为字符数组长度;
下面是我写的一个程序,我运行过了,可以的
#include<stdioh>
#define LEN 20 //字符数组的长度
/
定义一个函数用于计算字符串空格
/
int CountSpace(char pstr, int n)
{
char p_str;
int sum = 0;
int i = 0;
//遇到字符串中‘\0’或者是字符数组的结尾时退出循环,空格的ASCII是' '
for( p_str = pstr; p_str != '\0' && i < n; p_str ++, i ++ )
if( p_str == ' ' ) sum += 1;
printf( "%d\n", i );
return sum;
}
/
用函数CountSpace()求出字符串中空格的个数
/
void
main( void )
{
char str[LEN] = "I am a good boy";
int getch();
int i;
i = CountSpace( str, LEN );//用数组名做实参
printf( "%d", i );
getch();
}
在函数中有个printf( "%d\n", i ); 那个是用来判断循环次数的,不要也可以。你要是只用一个形参,且有'\0'判断结尾,你会发现你的循环次数超出字符数组的长度!虽然结果可能相同。。
我也是刚学C语言,(一个月)有机会多交流一下
既然都可以发一个字符了怎么不能发一个字符串呢?
unsigned char code str[] = "hello world!";
unsigned char pstr = str;
while(pstr)
{
send_a_char(pstr);
pstr ++;
}
大概就这思路吧。
以上就是关于C语言问题··全部的内容,包括:C语言问题··、编一程序,将字符串“Hello,C++!”赋给一个字符数组,然后从第一个字母开始间隔的输出该串()、用c++编写输入一个字符串统计其中数字字母空格和其他字符的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)