Combining Strings - Segmentation Fault


 
Thread Tools Search this Thread
Top Forums Programming Combining Strings - Segmentation Fault
# 1  
Old 02-10-2007
Combining Strings - Segmentation Fault

I am writing a function to combine strings, but when I execute I get a segmentation fault, which doesn't make sence. Segmentation fault is when you try to acess a point of memory that doesn't exist, like trying to acess array[10] when you declared array[7].

Here is the source code:
Code:
#include <stdio.h>
/* #include <string.h> == cheating! */

#define MAXINPUT 1000

char combine(char string1[MAXINPUT], char string2[MAXINPUT]) {
	int count1, count2 = 0;

	while (string1[count1] != '\0')
		++count1;

	while (string2[count2] != '\0')
		string1[count1++] = string2[count2++];
	string1[count1] = '\0';
}
main() {
	char string1[MAXINPUT];
	char string2[MAXINPUT];
	int i = 0;
	
	printf("Enter two strings each under 1000 characters:\n");
	while(i = 0) {
		printf("1: ");
		scanf("%s", string1);
		if ((sizeof string1) > MAXINPUT) {
			i = 0;
			printf("I said under 1000 characters, please enter it again:\n");
		}
		else
			i = 1;
	}
	i = 0;
	while(i = 0) {
		printf("\n2: ");
		scanf("%s", string2);
		if ((sizeof string2) > MAXINPUT) {
			i = 0;
			printf("I said under 1000 characters, please enter it again:\n");
		}
		else
			i = 1;
	}
	printf("%s and %s combined is %s", string1, string2, combine(string1, string2));
	return 0;
}

I know there are functions in the string.h header, but as you can see, I wanted to do it without them, thus calling those functions "cheating".

Thanks for reading.
# 2  
Old 02-11-2007
(sizeof string1) is a constant and will not vary depending on the contents of string1. And what if 1200 characters were entered? Where do you think the extra 200 will be? You seem to be intentionally blowing arrays.

But your problem is the combine routine. It returns a character, not a string. Or it would had you returned *anything*. Then you use this character as a pointer to character. It looks like you might mean for combine to return a pointer to character. If so, define it that way and put in a return statement.
# 3  
Old 02-11-2007
Quote:
Originally Posted by Perderabo
But your problem is the combine routine. It returns a character, not a string. Or it would had you returned *anything*. Then you use this character as a pointer to character. It looks like you might mean for combine to return a pointer to character. If so, define it that way and put in a return statement.
I'm sorry, but what does that have to do with the segmentation fault?
# 4  
Old 02-11-2007
1.st problem:
Quote:
Originally Posted by Octal
Here is the source code:
Code:
char combine(char string1[MAXINPUT], char string2[MAXINPUT]) {
	int count1, count2 = 0;

	while (string1[count1] != '\0')
		++count1;

	while (string2[count2] != '\0')
		string1[count1++] = string2[count2++];
	string1[count1] = '\0';
}

the function is declared as returning char; however there is no return statement that actually returns a char. In this case the function will return a "garbage" value even if the syntax is not necessarily incorrect!

2.nd problem:
Code:
..
	
	printf("Enter two strings each under 1000 characters:\n");
	while(i = 0) {   // should be while (i == 0)
		printf("1: ");
		scanf("%s", string1);
		if ((sizeof string1) > MAXINPUT) {
			i = 0;
			printf("I said under 1000 characters, please enter it again:\n");
		}
		else
			i = 1;
	}
	i = 0;
	while(i = 0) {   // should be while (i == 0)
		printf("\n2: ");
		scanf("%s", string2);
		if ((sizeof string2) > MAXINPUT) {
			i = 0;
			printf("I said under 1000 characters, please enter it again:\n");
		}
		else
...

# 5  
Old 02-11-2007
Quote:
Originally Posted by Octal
I'm sorry, but what does that have to do with the segmentation fault?
Umm, it's the cause.
# 6  
Old 02-11-2007
Thanks milhan, you explained it better. I still get a segmentation fault that I don't understand, the current source (almost same as before) :
Code:
#include <stdio.h>
/* #include <string.h> == cheating! */

#define MAXINPUT 1000

char combine(char string1[MAXINPUT], char string2[MAXINPUT]) {
	int count1, count2 = 0;

	while (string1[count1] != '\0')
		++count1;

	while (string2[count2] != '\0')
		string1[count1++] = string2[count2++];
	string1[count1] = '\0';
	return string1;
}
main() {
	char string1[MAXINPUT];
	char string2[MAXINPUT];
	int i = 0;
	
	printf("Enter two strings each under 1000 characters:\n");
	while(i == 0) {
		printf("1: ");
		scanf("%s", string1);
		if ((sizeof string1) > MAXINPUT) {
			i = 0;
			printf("I said under 1000 characters, please enter it again:\n");
		}
		else
			i = 1;
	}
	i = 0;
	while(i == 0) {
		printf("2: ");
		scanf("%s", string2);
		if ((sizeof string2) > MAXINPUT) {
			i = 0;
			printf("I said under 1000 characters, please enter it again:\n");
		}
		else
			i = 1;
	}
	printf("%s and %s combined is %s", string1, string2, combine(string1, string2));
	return 0;
}

I get an erorr related to
Code:
return string1;

Which is exactly as put:
Code:
combine-strings.c:15: warning: return makes integer from pointer without a cast

so, I assume that I could redeclare string1 as an int, to make the program compile, even though it wouldn't run correctly, because int is numbers(it can be ascii, but that adds up fast), and char is text. So I declare string1 like:
Code:
return (int) string1;

and I get a segmentaton fault after I enter the two strings. I assume that the int was the problem, so I try a few other examples:
Code:
return string1[0];

Which produces segmentation erorr when executed.
Code:
return string1[MAXLINE];

Also produces segmentation erorr when executed.

The odd part is I don't seem to be asking for a part of memory that doesn't exist.
# 7  
Old 02-11-2007
octal look at your combine(char [], char[]) function again. I didn't see it at my previous post either.
Code:
char combine(char string1[MAXINPUT], char string2[MAXINPUT]) {
	int count1, count2 = 0;   // you didn't initialize count1, so=> int count1 = 0, count2 = 0;
                         
	while (string1[count1] != '\0')
		++count1;

	while (string2[count2] != '\0')
		string1[count1++] = string2[count2++];
	string1[count1] = '\0';
	return string1;
}

Quote:
Code:
return string1[0];

Which produces segmentation erorr when executed.
return string1[0] is correct. The segmentation fault can't come from here. Try running again with the correction in the combine func. and return string1[0]..
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Programming

C. To segmentation fault or not to segmentation fault, that is the question.

Oddities with gcc, 2.95.3 for the AMIGA and 4.2.1 for MY current OSX 10.14.1... I am creating a basic calculator for the AMIGA ADE *NIX emulator in C as it does not have one. Below are two very condensed snippets of which I have added the results inside the each code section. IMPORTANT!... (11 Replies)
Discussion started by: wisecracker
11 Replies

2. Homework & Coursework Questions

Segmentation Fault

this is a network programming code to run a rock paper scissors in a client and server. I completed it and it was working without any error. After I added the findWinner function to the server code it starts giving me segmentation fault. -the segmentation fault is fixed Current problem -Also... (3 Replies)
Discussion started by: femchi
3 Replies

3. Programming

Using gdb, ignore beginning segmentation fault until reproduce environment segmentation fault

I use a binary name (ie polo) it gets some parameter , so for debugging normally i do this : i wrote script for watchdog my app (polo) and check every second if it's not running then start it , the problem is , if my app , remain in state of segmentation fault for a while (ie 15 ... (6 Replies)
Discussion started by: pooyair
6 Replies

4. UNIX for Advanced & Expert Users

segmentation fault with ps

What does this mean and why is this happening? $ ps -ef | grep ocular Segmentation fault (core dumped) $ ps -ef | grep ocular Segmentation fault (core dumped) $ ps aux | grep ocular Segmentation fault (core dumped) $ ps Segmentation fault (core dumped) $ pkill okular $ ps... (1 Reply)
Discussion started by: cokedude
1 Replies

5. Programming

segmentation fault.

This code is causing a segmentation fault and I can't figure out why. I'm new to UNIX and I need to learn how to avoid this segmentation fault thing. Thank you so much. Thanks also for the great answers to my last post.:):b: int main() { mysqlpp::Connection conn(false); if... (3 Replies)
Discussion started by: sepoto
3 Replies

6. Programming

Segmentation fault.

I'm getting a segmentation fault. I'm new to Linux programming. Thanks so much for all of your input.:eek: #include </usr/include/mysql++/mysql++.h> #include <stdio.h> #include <iostream> #include <sstream> #include <string.h> using namespace std; int outputToImport(const char*... (1 Reply)
Discussion started by: sepoto
1 Replies

7. Programming

segmentation fault

What is segmentation fault(core dumped) (1 Reply)
Discussion started by: gokult
1 Replies

8. Programming

segmentation fault

If I do this. Assume struct life { char *nolife; } struct life **life; // malloc initialization & everything if(life->nolife == 0) Would I get error at life->nolife if it is equal to 0. wrong accession? (3 Replies)
Discussion started by: joey
3 Replies

9. Programming

Why not a segmentation fault??

Hi, Why I don't receive a segmentation fault in the following sample. int main(void) { char buff; sprintf(buff,"Hello world"); printf("%s\n",buff); } If I define a buffer of 10 elements and I'm trying to put inside it twelve elements, Should I receive a sigsev... (22 Replies)
Discussion started by: lagigliaivan
22 Replies
Login or Register to Ask a Question