插字符问题

wei xin_44706101 2019-05-12 04:17:22

用于在一个已排好序(ASCII值从小到大)的字符串string(少于50个字符)中适当位置插入字符c 为什么输出错误
char * insert(char *string, char t)
{
int i,p;
for(i=0;i<50;i++)
{ if(t>string[i]);
{ p=(i+1);
break ;
}}


for(i=strlen(string);i>p;i--)
{string[i]=string[i-1];
}
string[p]=t;
string[strlen(string)]='\0';
return string;
}
void main()
{
char str[50],*s,c;
gets(str);
scanf("%c",&c);
s=insert(str,c);
puts(s);
}

输入abdef中插c 本该是abcdef
为什么输出结果却是bacdef 求解谢谢
...全文
145 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wei xin_44706101 2019-05-13
  • 打赏
  • 举报
回复
引用 13 楼 拥抱Linux 的回复:
[quote=引用 12 楼 wei xin_44706101 的回复:]
可以可以 超级感谢

很高兴可以帮到你! 祝 C 语言学习进步!
:)[/quote]兄弟 在帮我看看这题 邀请了你https://bbs.csdn.net/topics/392624039
拥抱Linux 2019-05-12
  • 打赏
  • 举报
回复
引用 12 楼 wei xin_44706101 的回复:
可以可以 超级感谢

很高兴可以帮到你! 祝 C 语言学习进步!
:)
wei xin_44706101 2019-05-12
  • 打赏
  • 举报
回复
引用 11 楼 拥抱Linux 的回复:
简单修改了一下,增加了几句注释,你先看看,试试。
主要是一下子不容易想到足够多的、很合适的测试数据,所以不好确定究竟还有没有疏漏。先试试吧。

#include <string.h>
#include <stdio.h>

char *invert(char *s)
{
char *p, *t, str;
int i;
p = s + strlen(s) - 1;
t = s;
// strlen()的返回值的数据类型是 size_t
// size_t 是 unsigned int 类型,是 非负数
// 比较大小的时候,C 语言会对 比较运算符 左右两边的操作数 先进行隐式类型转换
// 对于 int 型 与 unsigned int 型的运算,
// C 会把 int 型 先隐式转换为 unsigned int 型,
// 于是 int 型的 -1 就成了 unsign int 型的取值范围的最大的数了
for (i = (strlen(s) - 1); i >= (int)(strlen(s) / 2); i--) {
str = *p;
*p = *t;
*t = str;
p--;
t++;
}
return s;
}

int main(void)
{
char a[20][101], *y;
int n, i;
scanf("%d", &n);

for (i = 0; i < n; i++) {
scanf("%s", &a[i]);
}

for (i = 0; i < n; i++) {
y = invert(&a[i]);
printf("%s\n", y);
}
return 0;
}
可以可以 超级感谢
拥抱Linux 2019-05-12
  • 打赏
  • 举报
回复
简单修改了一下,增加了几句注释,你先看看,试试。
主要是一下子不容易想到足够多的、很合适的测试数据,所以不好确定究竟还有没有疏漏。先试试吧。

#include <string.h>
#include <stdio.h>

char *invert(char *s)
{
char *p, *t, str;
int i;
p = s + strlen(s) - 1;
t = s;
// strlen()的返回值的数据类型是 size_t
// size_t 是 unsigned int 类型,是 非负数
// 比较大小的时候,C 语言会对 比较运算符 左右两边的操作数 先进行隐式类型转换
// 对于 int 型 与 unsigned int 型的运算,
// C 会把 int 型 先隐式转换为 unsigned int 型,
// 于是 int 型的 -1 就成了 unsign int 型的取值范围的最大的数了
for (i = (strlen(s) - 1); i >= (int)(strlen(s) / 2); i--) {
str = *p;
*p = *t;
*t = str;
p--;
t++;
}
return s;
}

int main(void)
{
char a[20][101], *y;
int n, i;
scanf("%d", &n);

for (i = 0; i < n; i++) {
scanf("%s", &a[i]);
}

for (i = 0; i < n; i++) {
y = invert(&a[i]);
printf("%s\n", y);
}
return 0;
}
wei xin_44706101 2019-05-12
  • 打赏
  • 举报
回复
没事没事 拜托拜托啦
拥抱Linux 2019-05-12
  • 打赏
  • 举报
回复
引用 7 楼 wei xin_44706101 的回复:
帮我看看 拜托编译没有问题 运行时会有错误发生
可能
数组越界使用;
指针的错误使用


哦, 看岔了, 没注意你发的代码是不一样的。。。 等俺先看看吧。
拥抱Linux 2019-05-12
  • 打赏
  • 举报
回复
引用 7 楼 wei xin_44706101 的回复:
帮我看看那个程序 拜托 编译没有错误 运行时会崩溃 说什么有
帮我看看 拜托编译没有问题 运行时会有错误发生
可能
数组越界使用;
指针的错误使用


上面的程序,运行时会发生错误吗? 俺这边测试下来,暂时没有运行错误啊。
能 具体 描述一下是什么输入、什么错误提示吗?
wei xin_44706101 2019-05-12
  • 打赏
  • 举报
回复
帮我看看那个程序 拜托 编译没有错误 运行时会崩溃 说什么有

引用 6 楼 拥抱Linux 的回复:
[quote=引用 4 楼 wei xin_44706101 的回复:]
能否帮我再看一题 大神


您太客气了,俺不是大神,俺也是C语言学习者一枚。坛子里大神、大佬很多,只是他们可能偶尔没时间现身而已。
您有疑问的话,可以发帖求助,俺有条件的话,也乐意提供力所能及的帮助的。
:)[/quote]帮我看看 拜托编译没有问题 运行时会有错误发生
可能
数组越界使用;
指针的错误使用
拥抱Linux 2019-05-12
  • 打赏
  • 举报
回复
引用 4 楼 wei xin_44706101 的回复:
能否帮我再看一题 大神


您太客气了,俺不是大神,俺也是C语言学习者一枚。坛子里大神、大佬很多,只是他们可能偶尔没时间现身而已。
您有疑问的话,可以发帖求助,俺有条件的话,也乐意提供力所能及的帮助的。
:)
wei xin_44706101 2019-05-12
  • 打赏
  • 举报
回复

#include<string.h>
#include<stdio.h>
char*invert(char*s)
{ char*p,*t,str;
int i;
p=s+strlen(s)-1;
t=s;
for(i=(strlen(s)-1);i>=(strlen(s)/2);i--)
{ str=*p;
*p=*t;
*t=str;
p--;
t++;
}
return s;
}
int main()
{ char a[20][101],*y;
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s",&a[i]);
for(i=0;i<n;i++)
{y=invert(a[i]);
printf("%s\n",y);;
}}
输入
从键盘输入整数n,然后再输入n个字符串,每行一个字符串。
输出
输出各个字符串颠倒以后的字符串,每个字符串之间用换行符隔开
为什么有两个点过不了 老是运行时发生错误
wei xin_44706101 2019-05-12
  • 打赏
  • 举报
回复
能否帮我再看一题 大神
wei xin_44706101 2019-05-12
  • 打赏
  • 举报
回复
有帮助有帮助
拥抱Linux 2019-05-12
  • 打赏
  • 举报
回复
补充一下,上面的代码没有对 insert 函数中的变量 p 进行初始化, 也遗漏了 对 插入点在 末尾的情况 的检查, 需要完善一下,insert 函数的 新代码如下:

char *insert(char *string, char t)
{
int i, p = 0;
int len = strlen(string);
for (i = 0; i < len; i++) {
if (t < string[i]) {
p = i;
break;
}
}
// 插入点是末尾的情况
if (i == len) {
p = len;
}

for (i = len; i > p; i--) {
string[i] = string[i - 1];
}
string[p] = t;
string[len + 1] = '\0';
return string;
}


如有帮助,欢迎 及时 结帖、给分! :)
拥抱Linux 2019-05-12
  • 打赏
  • 举报
回复
(1) insert 函数里, if() 的后面 多了 一个 分号 。
(2) if()里面的判断插入点的条件也不对,比如 字符 'c' 的 ASCII 值 比 字符 'a' 的大, 直接第一次比较 就 结束了,但是 插入到 'a' 的后面肯定不对嘛。
(3)把字符数组 string 里的字符 从插入点 往后 整体移动一位之后, 字符数组最后面的后面一位元素 不一定是 '\0' ,那么 继续使用 strlen(string) 来获取 新状态的 字符串的长度的话,是可能出错的。因为,之前并没有对 字符数组进行过初始化!
(4)简单改了一下,

#include <stdio.h>

char *insert(char *string, char t)
{
int i, p;
int len = strlen(string);
for (i = 0; i < len; i++) {
if (t < string[i]) {
p = i;
break;
}
}

for (i = len; i > p; i--) {
string[i] = string[i - 1];
}
string[p] = t;
string[len + 1] = '\0';
return string;
}

int main(void)
{
char str[50], *s, c;
gets(str);
scanf("%c", &c);
s = insert(str, c);
puts(s);
return 0;
}

(5)多说一句,其实完全没必要让 insert 函数返回指针,因为 实际上已经修改了 main 函数中的 str 字符数组中的元素了。

如有帮助,欢迎 及时 结帖、给分! :)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧