Hàm chuỗi chạy sai

c
c++

(newbieIT) #1

Nhờ anh chị coi giúp, e viết hàm thêm dấu “,” vào vị trí k như sau. Chương trình in ra đúng nhưng phía sau còn có thêm một dãy kí tự ascII không mong muốn. Anh chị coi giúp e sai chỗ nào

#include <stdio.h>
#include <string.h>
#define max 30
char* addptu(char *s, int k)
{
	int i;
	for (i = strlen(s) - 1; i >= k; i--)
	{
		s[i + 1] = s[i];
	}
	int x = strlen(s) + 1;
	s[x] = '/0';
	s[k] = ',';
	return s;
}
void main()
{
	char so[max];
	int k;
	gets(so);
	scanf("%d", &k);
	printf("%s", addptu(so,k));
}

(rogp10) #2

Bạn đã ghi đè lên byte cuối cùng thì strlen sau đó sẽ chạy tuốt luôn :smiley:

Vả lại còn phải xét trường hợp chuỗi ngắn.


(newbieIT) #3

là sao anh? e gán ký tự cuối cùng là NULL để kết thúc chuỗi mà?


(Trương Tấn Phát) #4

Thế mà cũng chạy được á???
Kí tự NULL'\0' chứ không phải '/0'.
Dấu gạch (chia) ngược.


(newbieIT) #5

:)) e đánh nhầm ấy, còn cái ghi đè lên ý a là mình ghi đè lên ký tự null nên nó chạy hết max(30) ký tự phải ko?
Vậy giải pháp là gán cho chuỗi khác hả?


(Trương Tấn Phát) #6

Trong vòng lặp, bạn đã ghi đè mất kí tự NULL nên khi khi gọi strlen() ở sau thì giá trị này sai.

Chuyển:

lên trước vòng lặp.


(newbieIT) #7

oh e hiểu rồi, cám ơn anh nhiều


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?