I need to prompt the user to enter two strings and then create a third string with the first half of string1 and the second half of string2. I was able to put the first half of string1 into string3 but I cannot figure out how to put the second half of string2 into string 3. Here's my code:

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

int main ()
{	
	char string1[255], string2[255], string3[255];
	int string1Len = 0, string2Len = 0;
	
	printf ("Enter String 1: ");
	fgets (string1, 255, stdin);
	string1[strlen(string1) - 1] = '\0';
	string1Len = strlen(string1);

	printf ("Enter String 2: ");
	fgets (string2, 255, stdin);
	string2[strlen(string2) - 1] = '\0';
	string2Len = strlen(string2);
	
	printf ("String 1 is %d bytes long and String 2 is %d bytes long.\n", string1Len, string2Len);
	
	strncpy (string3, string1, string1Len / 2);
	string3[string1Len / 2] = '\0';
	strcat (string3, " ");
		
	strncat (string3, string2, string2Len / 2);    
	printf ("String 3 is: %s\n", string3);

    system("pause");
    	
	return 0;
}

Dani AI

Generated

A quick diagnosis and a safe, practical fix.

The reason the original attempt produced the wrong half is that strncat(string3, string2, string2Len/2) copies the first N characters of string2 (source starting at index 0). To append the second half you must start copying at the midpoint of string2 (pointer arithmetic or an offset) and copy the remainder. That is what and were pointing toward — compute the midpoint with strlen and use that index as the source. If the goal is to split on words instead of characters, follow ’s hint and locate a space or use tokenising.

A compact, safer pattern (handles newlines and avoids overruns) — copy the first half of s1, then append a space and the substring starting at s2[mid]:

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

static void trim_newline(char *s) {
    char *p = strchr(s, '\n');
    if (p) *p = '\0';
}

int main(void) {
    char s1[256], s2[256], out[512];
    if (!fgets(s1, sizeof s1, stdin) || !fgets(s2, sizeof s2, stdin)) return 0;
    trim_newline(s1); trim_newline(s2);

    size_t l1 = strlen(s1), l2 = strlen(s2);
    size_t half1 = l1 / 2;           /* floor(l/2); use (l+1)/2 if you want the larger half second */
    size_t start2 = l2 / 2;

    /* safe formatting: %.*s takes an int precision for substring copy */
    int needed = snprintf(out, sizeof out, "%.*s %s", (int)half1, s1, s2 + start2);
    if (needed >= (int)sizeof out) {
        /* handle truncation if needed */
    }
    puts(out);
    return 0;
}

Troubleshooting notes: never strip a newline by blindly doing s[strlen(s)-1]=0 without checking the character exists; use strchr or check the last char. Use size_t for lengths, check snprintf’s return for truncation, and decide whether “half” should be floor or ceil for odd lengths. If the split should be by word boundaries, find the word boundary instead of splitting by character.

Recommended Answers

All 13 Replies

strcat (string3, &string2[start-of-second-half]); This passes the address of the position of string2 you want to add.

strcat (string3, &string2[start-of-second-half]); This passes the address of the position of string2 you want to add.

What do you put if the position of the beginning of the second half is unknown, since this is from user input?

Is the second half of string2 preceded by a space?

Is the second half of string2 preceded by a space?

Yes I put one in.

strcat (string3, " ");

Do you just need to copy 1 word or is it a sentence that you need to copy the whole second half of the sentence?

well you could do it like this
use strtok for the string 2 and set space as the delimeter
once it's at its second iteration then you could copy the content to string3

why you use strcat() method....you can try use loop read char by char and place in third string

why you use strcat() method....you can try use loop read char by char and place in third string

what is the syntax for that?

why you use strcat() method....you can try use loop read char by char and place in third string

My guess is that the purpose of the function is to concatinate strings, which is also (surprisingly) the object of the assignment.

What do you put if the position of the beginning of the second half is unknown, since this is from user input?

If you don't know where "the position of the beginning of the second half is, you can't do the program. I assume you need to figure out where the second half starts.

My guess is that the purpose of the function is to concatinate strings, which is also (surprisingly) the object of the assignment.


If you don't know where "the position of the beginning of the second half is, you can't do the program. I assume you need to figure out where the second half starts.

Any suggestions as to how I go about that. I've read the chapter over a dozen times and done a ton of research online but I still can't figure out what I'm missing.

Given: sentence 1 = "This it the time to fly"
Given: sentence 2 = ""To err is human, to really foul things up takes a computer"

What is the resulting sentence supposed to be? Not by computer. By definition of the assignment.

Given: sentence 1 = "This it the time to fly"
Given: sentence 2 = ""To err is human, to really foul things up takes a computer"

What is the resulting sentence supposed to be? Not by computer. By definition of the assignment.

First half of string 1 would be: This is the
Second half of string 2 would be: ul things up takes a computer

It would display as: "This it the ul things up takes a computer"

First half of string 1 would be: This is the
Second half of string 2 would be: ul things up takes a computer

It would display as: "This it the ul things up takes a computer"

How do you figure this?
What did you do to arrive at "This is the" and "ul things up takes a computer"?
Put that into code...

How long is a sentence? How can you figure that out in code?
What's half a sentence?
etc, etc...
'Tis simplicity itself when you stop thinking in terms of the end product, and think in terms of one step at a time.

Remember, a journey of a thousand miles begins with a single step. Then another. And another. Until you drop 10 feet before the gate in exhaustion. No wait -- that's not how it goes. :icon_wink:

strcat (string3, &string2[start-of-second-half]); This passes the address of the position of string2 you want to add.

start of second half can be calculated by using strlen and half of it.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.