Hello,
here I have a strange problem with a real simple strtok example.
The program is as follows:
### BEGIN STRTOK ###
#include <string.h>
#include <stdio.h>
int main()
{
char *input1 = "Hello, World!";
char *tok;
tok = strtok(input1, " ");
if(tok) printf("%s\n", tok);
tok = strtok(NULL, " ");
if(tok) printf("%s\n", tok);
return(0);
}
### END STRTOK ###
Now, when I run it from the command line, I get a bus error:
### BEGIN COMMAND LINE OUTPUT ###
gcc -ggdb -Wall -o strtok strtok.c
./strtok
Bus error (core dumped)
Exit 138
### END COMMAND LINE OUTPUT ###
When I run it step by step in GDB, the program terminates normally:
### BEGIN DEBUGGER OUTPUT ###
gdb ./strtok
GNU gdb 6.1.1 [FreeBSD]
[snip]GDB copyright and bla bla[/snip]
(gdb) break main
Breakpoint 1 at 0x8048570: file strtok.c, line 6.
(gdb) run
Starting program: /home/piter/strtok
Breakpoint 1, main () at strtok.c:6
6 char *input1 = "Hello, World!";
(gdb) next
10 tok = strtok(input1, " ");
(gdb)
11 if(tok) printf("%s\n", tok);
(gdb)
Hello,
13 tok = strtok(NULL, " ");
(gdb)
14 if(tok) printf("%s\n", tok);
(gdb)
World!
16 return(0);
(gdb)
18 }
(gdb)
0x08048485 in _start ()
(gdb)
Single stepping until exit from function _start,
which has no line number information.
Program exited normally.
(gdb)
### END DEBUGGER OUTPUT ###
Is there something I'm missing wrt C and/or strtok, or it's rather a
problem related to my environment (in which case I'll be happy to post
in the right newsgroup) ?
Thanx in advance
--
Pietro Cerutti
PGP Public Key ID: http://gahr.ch/pgp 29 2587
Pietro Cerutti wrote:
Hello,
here I have a strange problem with a real simple strtok example.
The program is as follows:
### BEGIN STRTOK ###
#include <string.h>
#include <stdio.h>
int main()
{
char *input1 = "Hello, World!";
char *tok;
tok = strtok(input1, " ");
strtok alters its input. You are passing it a string literal, modifying
a string literal invokes the demons of undefined behavior. Don't.
--
Ian Collins.
Pietro Cerutti said:
Hello,
here I have a strange problem with a real simple strtok example.
The program is as follows:
### BEGIN STRTOK ###
#include <string.h>
#include <stdio.h>
int main()
{
char *input1 = "Hello, World!";
char *tok;
tok = strtok(input1, " ");
strtok modifies the string you pass it. You pass it a string literal.
You're not allowed to modify string literals.
Change
char *input1 = "Hello, World!";
to
char input1[] = "Hello, World!";
--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999 http://www.cpax.org.uk
email: rjh at the above domain, - www.
Pietro Cerutti wrote:
char *input1 = "Hello, World!";
just in case, I know that the string to be tokenized shouldn't be a
constant, but rather an array of chars.
So, it should be declared as
char input1[14] = "Hello, World!";
The thing I don't understand is: why does it works in GDB?
--
Pietro Cerutti
PGP Public Key: http://gahr.ch/pgp
Pietro Cerutti wrote:
Pietro Cerutti wrote:
> char *input1 = "Hello, World!";
just in case, I know that the string to be tokenized shouldn't be a
constant, but rather an array of chars.
So, it should be declared as
char input1[14] = "Hello, World!";
The thing I don't understand is: why does it works in GDB?
Luck?
--
Ian Collins.
Ian Collins wrote:
Pietro Cerutti wrote:
>Pietro Cerutti wrote:
>> char *input1 = "Hello, World!";
just in case, I know that the string to be tokenized shouldn't be a constant, but rather an array of chars. So, it should be declared as
char input1[14] = "Hello, World!";
The thing I don't understand is: why does it works in GDB?
Luck?
Ya, maybe.
The point is:
I understand what UB means, so WW3 could start now and I'd know why...
But if a string literal is - by definition - not modifiable, then how
can it happen that GDB actually modifies it using strtok?
--
Pietro Cerutti
PGP Public Key: http://gahr.ch/pgp
Pietro Cerutti wrote:
here I have a strange problem with a real simple strtok example.
Guess: you're trying to use it on a literal string.
The program is as follows:
### BEGIN STRTOK ###
#include <string.h>
#include <stdio.h>
int main()
{
char *input1 = "Hello, World!";
char *tok;
tok = strtok(input1, " ");
if(tok) printf("%s\n", tok);
tok = strtok(NULL, " ");
if(tok) printf("%s\n", tok);
return(0);
}
(fx:dancing) Yes!
`strtok` writes to its argument -- it sticks nuls in there to make
the strings it returns.
You're not allowed to write into a string literal: that gets you
undefined behaviour.
An implementation may just write into the string. Or it may abort in
some way. Or it may ignore the write. Or it may write somewhere else
entirely. Or it may mail a report to your co-coders, or start a game
of rogue, or book you a holiday in the Lake District, or set fire to
your keyboard, or arrange a date with your Most Preferred Person.
[That last one never seems to happen, though.]
--
"You've spotted a flaw in my thinking, Trev" Big Al,/The Beiderbeck Connection/
Hewlett-Packard Limited registered office: Cain Road, Bracknell,
registered no: 690597 England Berks RG12 1HN
Chris Dollin wrote:
You're not allowed to write into a string literal: that gets you
undefined behaviour.
An implementation may just write into the string.
Uh? So you mean that a string literal isn't unmodifiable by definition?
--
Pietro Cerutti
PGP Public Key: http://gahr.ch/pgp
Pietro Cerutti <ga**@gahr.chwr ites:
Pietro Cerutti wrote:
> char *input1 = "Hello, World!";
just in case, I know that the string to be tokenized shouldn't be a
constant, but rather an array of chars.
So, it should be declared as
char input1[14] = "Hello, World!";
The thing I don't understand is: why does it works in GDB?
Because it invokes undefined behavior. There are no rules about what
happens. It can crash, it can "work", it can make demons fly out of
your nose.
(I suppose string literals are stored in write-protected memory when
your program runs normally, but not when it runs under gdb -- which
seems odd.)
--
Keith Thompson (The_Other_Keit h) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Keith Thompson wrote:
(I suppose string literals are stored in write-protected memory when
your program runs normally, but not when it runs under gdb -- which
seems odd.)
Yes it's weird, but it's a logical explanation.
I'll investigate with the freebsd people..
Thank you.
--
Pietro Cerutti
PGP Public Key: http://gahr.ch/pgp This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Naveen Parihar |
last post by:
I've a binary that runs on most of our servers but segfaults on one of
the servers. Further, even on this specific machine, the binary runs
successfully sometimes but segfaults most of the time. While trying to
debug this behaviour using gdb, I found out that the segfaults occurs
randomly at different places in the code. For example, once a pointer
was not initiallized to NULL (it was pointing to x8 insterad of x0) in
a constructor, even...
|
by: Fatih Gey |
last post by:
Hi,
.. following causes a segfault. .. didn't
know why ?!
int main() {
char name;
strcpy (name, "ab8bc8cd8ed");
char cur;
|
by: ern |
last post by:
I'm using strtok( ) to capture lines of input. After I call
"splitCommand", I call strtok( ) again to get the next line. Strtok( )
returns NULL (but there is more in the file...). That didn't happen
before 'splitCommands' entered the picture. The problem is in
splitCommands( ) somehow modifying the pointer, but I HAVE to call that
function. Is there a way to make a copy of it or something ?
/* HERE IS MY CODE */
char *...
|
by: bofh1234 |
last post by:
I need to delimit a string. The delimiters are a semicolon and comma.
When I run the program I get a segmentation fault on the first strtok.
I followed the examples of others and from my old C books, but I can't
seem to find the problem. The accesslist has a format of
20,45;22,44;46,28;99,43,etc. What am I doing wrong?
Thanks,
#include <sys/signal.h>
#include <messages.h>
|
by: hu |
last post by:
hi, everybody!
I'm testing the fuction of strtok(). The environment is WinXP, VC++6.0.
Program is simple, but mistake is confusing. First, the below code can get
right outcome:"ello world, hello dreams."
#include <stdafx.h>
#include <string.h>
#include <stdio.h>
int main()
| |
by: Michael |
last post by:
Hi,
I have a proble I don't understand when using strtok(). It seems that if I
make a call to strtok(), then make a call to another function that also
makes use of strtok(), the original call is somehow confused or upset.
I have the following code, which I am using to tokenise some input which is
in th form x:y:1.2:
int tokenize_input(Sale *sale, char *string){
|
by: nomad5000 |
last post by:
Hi everybody!
I'm having trouble using strtok to fill a matrix with int nrs. from a file.
the code that is not working is the following:
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
using namespace std;
|
by: magicman |
last post by:
can anyone point me out to its implementation in C before I roll my
own.
thx
|
by: Pilcrow |
last post by:
Here is a quick program, together with its output, that illustrates what
I consider to be a deficiency of the standard function strtok from
<string.h>:
I am using
C:\>gcc --version
gcc (GCC) 3.4.5 (mingw special)
I would like there to be a default, to be returned when two delimiters
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
| |
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |