Empty string: Difference between revisions

From Rosetta Code
Content added Content deleted
(Added Nemerle)
(added assigning an empty string)
Line 12: Line 12:
=={{header|C}}==
=={{header|C}}==
In C the strings are <code>char</code> pointers. A string terminates with the null char (U+0000, <code>'\0'</code>), which is not considered part of the string. Thus an empty string is <code>"\0"</code>, while a null string is a null pointer which points to nothing.
In C the strings are <code>char</code> pointers. A string terminates with the null char (U+0000, <code>'\0'</code>), which is not considered part of the string. Thus an empty string is <code>"\0"</code>, while a null string is a null pointer which points to nothing.
<lang C>/* to test a null string */
<lang C>/* assign an empty string */
char *str = "";
/* to test a null string */
if (str) { ... }
if (str) { ... }
/* to test if string is empty */
/* to test if string is empty */

Revision as of 01:57, 14 July 2011

Empty string is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

Some languages have syntax or semantics for dealing specifically with empty strings.

The task is to:

  • Demonstrate how to assign an empty string to a variable.
  • Demonstrate how to check that a string is empty
  • Demonstrate how to check that a string is not empty.

C

In C the strings are char pointers. A string terminates with the null char (U+0000, '\0'), which is not considered part of the string. Thus an empty string is "\0", while a null string is a null pointer which points to nothing. <lang C>/* assign an empty string */ char *str = ""; /* to test a null string */ if (str) { ... } /* to test if string is empty */ if (str[0] == '\0') { ... } /* or equivalently use strlen function */ if (strlen(str) == 0) { ... } /* or compare to a known empty string, same thing. "== 0" means strings are equal */ if (strcmp(str, "") == 0) { ... } </lang>

D

D treats null strings and empty strings as equal on the value level, but different on object level. You need to take this into account when checking for empty. <lang d>void main(){

   string s1 = null;
   string s2 = "";
   
   // the content is the same
   assert(!s1.length); 
   assert(!s2.length);
   assert(s1 == "" && s1 == null); 
   assert(s2 == "" && s2 == null);
   assert(s1 == s2);
   // but they don't point to the same memory region
   assert(s1 is null && s1 !is "");
   assert(s2 is "" && s2 !is null);
   assert(s1 !is s2);
   assert(s1.ptr == null);
   assert(*s2.ptr == '\0');
   
   assert(isEmpty(s1));    
   assert(isEmptyNotNull(s2));    

}

bool isEmpty(string s) {

   return !s.length;

}

bool isEmptyNotNull(string s) {

   return s is "";

}</lang>

Icon and Unicon

Icon and Unicon don't have special syntax for null strings but can produce them in several ways <lang Icon>s := "" # null string s := string('A'--'A') # ... converted from cset difference s := char(0)[0:0] # ... by slicing

s1 == "" # lexical comparison, could convert s1 to string s1 === "" # comparison won't force conversion

  • s1 = 0 # zero length, however, *x is polymorphic
  • string(s1) = 0 # zero length string

s1 ~== "" # non null strings comparisons s1 ~=== ""

  • string(s1) ~= 0

s := &null # NOT a null string, null type /s # test for null type \s # test for non-null type </lang>

J

<lang j> variable=:

  0=#variable

1

  0<#variable

0</lang>

Note that J attempts to make no distinction between empty lists, regardless of their type. In other words, while some operations can reveal the type of an empty list (for example, anything that can introduce padding based on the type of the list itself) this distinction is ignored whenever possible. You can perform arithmetic on an empty string, and you can append text to an empty list of numbers even though these operations would not succeed on non-empty lists of the same type.

Thus it's not appropriate, in general case J code, to check that an empty string is of type string.

Note also that in an if. or while. statement, J treats an empty string (or the absence of any argument) as true.

Java

String.isEmpty() is part of Java 1.6. Other options for previous versions are noted. <lang java5>String s = ""; if(s != null && s.isEmpty()){//optionally, instead of "s.isEmpty()": "s.length() == 0" or "s.equals("")"

  System.out.println("s is empty");

}else{

  System.out.println("s is not empty");

}</lang>

Nemerle

Assign an empty string: <lang Nemerle>def empty = ""; mutable fill_later = "";</lang> Check if a string is empty/not empty: <lang Nemerle>a_string == ""; a_string != 0; a_string.Length == 0; a_string.Length > 0;</lang>

OCaml

<lang ocaml>let is_string_empty s =

 (s = "")

let () =

 let s1 = ""
 and s2 = "not empty" in
 Printf.printf "s1 empty? %b\n" (is_string_empty s1);
 Printf.printf "s2 empty? %b\n" (is_string_empty s2);
</lang>

outputs:

s1 empty? true
s2 empty? false

PARI/GP

<lang parigp>a=""; isEmpty(s)=s=="" \\ Alternately: isEmpty(s)=#s==0 isNonempty(s)=s!="" \\ Alternatively: isNonempty(s)=#s</lang>

Perl

In Perl, an empty string is often used to represent a false value. <lang Perl>$s = ""; if ($s) { ... } # false

  1. to tell if a string is false because it's empty, or it's plain not there (undefined)

$s = undef; if (defined $s) { ... } # false; would be true on ""

  1. though, perl implicitly converts between strings and numbers, so this is also false

$s = "0"; if ($s) { ... } # false; also false on "000", "0.0", "\x0", "0 with text", etc

  1. but a string that converts to number 0 is not always false, though:

$s = "0 but true"; if ($s) { ... } # it's true! black magic!</lang>

Perl 6

In Perl 6 we can't just test a string for truth to determine if it has a value. The string "0" will test as false even though it has a value. Instead we must test for length.

<lang perl6>my $s = ; say 'String is empty' unless $s.chars; say 'String is not empty' if $s.chars;</lang>

PicoLisp

The empty string is represented by 'NIL' in PicoLisp. During input, two subsequent double qoutes '""' return the symbol NIL. <lang PicoLisp># To assign a variable an empty string: (off String) (setq String "") (setq String NIL)

  1. To check for an empty string:

(or String ..) (ifn String ..) (unless String ..)

  1. or a non-empty string:

(and String ..) (if String ..) (when String ..)</lang>

PureBasic

In PureBasic we can just test a string for truth to determine if it has a value. <lang PureBasic>Procedure.s isStringEmpty(a.s)

 If a
   ProcedureReturn "String is not empty, it contains '" + a + "'."
 Else
   ProcedureReturn "String is empty, or null."
 EndIf 

EndProcedure

If OpenConsole()

 Define a.s = ""
 Define b.s = "stuff"
 PrintN(isStringEmpty(a))
 PrintN(isStringEmpty(b))
 
 Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
 CloseConsole()

EndIf</lang> Sample output:

String is empty, or null.
String is not empty, it contains 'stuff'.

Python

The empty string is printed by Python REPL as '', and is treated as boolean false, (as are most empty container types, by convention). Any non-empty string, including '0', is always treated as True in a boolean context. <lang python>s = if not s:

   print('String s is empty.')

if s:

   print('String s is not empty.')</lang>

Tcl

The only special position that the empty string has in Tcl is that a great many commands return it, and the REPL of tclsh and wish doesn't print it. Otherwise, it is just like any other value. <lang tcl>set s "" if {$s eq ""} {puts "s contains an empty string"} if {$s ne ""} {puts "s contains a non-empty string"}</lang> There are other ways to check for emptiness and non-emptiness too (though the above are favored for reasons of simplicity, clarity and speed): <lang tcl>if {[string equal $s ""]} {puts "is empty"} if {[string length $s] == 0} {puts "is empty"} if {[string compare $s ""] != 0} {puts "is non-empty"}</lang>